如何在C#中构建此XML

5
我需要生成这个看起来简单的XML,寻找一种干净的方法来生成它。
<order>
<user>2343></user>
<creditcardtype>2333></creditcarttype>
<country>USA</country>
<orderDetails>
   <amount>23434</amount>
   <shipping>32</shipping>
</orderDetails>
</order>

1
你为什么不把像用户ID这样的东西合并到属性中呢?比如:<order user="2343">... - Rob Fonseca-Ensor
如果他正在调用非SOAP的Web服务,则可能需要一个格式化为这样的XML。 - Alex Bagnolini
很遗憾,我无法控制格式。 - mrblah
6个回答

11

使用XDocument类,代码将会像这样:

XDocument srcTree = new XDocument(
    new XElement("order",
        new XElement("user", "2343"),
        new XElement("creditcardtype", "2333"),
        new XElement("country", "USA"),
        new XElement("orderDetails",
            new XElement ("amount", "23434"),
            new XElement ("shipping", "32")

        )
    )
);

11

既然已经使用了XDocument,这里提供一个XmlWriter的答案:

    StringWriter sw = new StringWriter();
    using (XmlWriter xw = XmlWriter.Create(sw)) {
        xw.WriteStartElement("order");
        xw.WriteElementString("user", "2343");
        xw.WriteElementString("creditcardtype", "2333");
        xw.WriteElementString("country", "USA");
        xw.WriteStartElement("orderDetails");
        xw.WriteElementString("amount", "23434");
        xw.WriteElementString("shipping", "32");
        xw.WriteEndElement();
        xw.WriteEndElement();
    }
    string s = sw.ToString();

或者使用 XmlSerializer

[XmlRoot("order")] public class Order {
    [XmlElement("user")] public int User { get; set; }
    [XmlElement("creditcardtype")] public int CreditCardType { get; set; }
    [XmlElement("country")] public string Country { get; set; }
    [XmlElement("orderDetails")] public OrderDetails Details { get; set; }
}
public class OrderDetails {
    [XmlElement("amount")] public int Amount { get; set; }
    [XmlElement("shipping")] public int Shipping { get; set; }
}
....
var order = new Order {
    User = 2343, CreditCardType = 2333, Country = "USA",
    Details = new OrderDetails {
        Amount = 23434,
        Shipping = 32
    }
};
XmlSerializer ser = new XmlSerializer(order.GetType());
StringWriter sw = new StringWriter();
ser.Serialize(sw, order);
string s = sw.ToString();

我非常确定XmlWriter方法也是最快的,至少根据我所做的基准测试是如此。如果您想序列化对象模型而不是直接生成XML,则WCF DataContractSerializer也很快。 - Chris Patterson
+10 分给 Marc。不仅因为他回答了问题,而且还花了功夫解释了两种方法。 - Dienekes

4

请参考LINQ to XML的方式来完成此操作,类似于以下内容:

XDocument doc = new XDocument(new XElement("order",
                   new XElement("user", "2343"),
                   new XElement("creditcardtype", "2333"),
                   new XElement("country", "USA"),
               new XElement("orderDetails",
                   new XElement("amount", "23434"),
                   new XElement("shipping", "32"))));
doc.Save("myxml.xml");

2
XmlDocument xml = new XmlDocument();

XmlElement order = xml.CreateElement("order");

xml.AppendChild(order);

XmlElement user = xml.CreateElement("user");
user.InnerText = "2343";
order.AppendChild(user);

XmlElement ccType = xml.CreateElement("creditcardtype");
ccType.InnerText = "2333";
order.AppendChild(ccType);

etc


1
  1. 编写一个描述你结构的XML模式。 (您还可以使用xsd.exe根据给定的XML文件自动生成模式。)
  2. 使用xsd.exe /classes根据您的XML模式生成C#类。
  3. 现在,您可以使用XmlSerializer类将XML序列化/反序列化为C#对象结构。

还有一篇codeproject article描述了这种方法。


这也是提到的所有方法中最慢的一种。 - Chris Patterson
1
我猜XmlDocument方法甚至更慢...不管怎样,我喜欢它的是一切都是强类型的,你甚至可以进行模式验证。 - Vinz

0
我会选择Linq to XML建议,但为了完整性,我必须补充一下:
var xe = XElement.Parse("<order><user>2343</user><creditcardtype>2333</creditcarttype><country>USA</country><orderDetails><amount>23434</amount><shipping>32</shipping></orderDetails></order>");

:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接