2009-11-24 6 views
5

? Necesito generar este XML simple buscando, buscando una manera limpia de generarlo.¿Cómo construiría este xml en C#

<order> 
<user>2343></user> 
<creditcardtype>2333></creditcarttype> 
<country>USA</country> 
<orderDetails> 
    <amount>23434</amount> 
    <shipping>32</shipping> 
</orderDetails> 
</order> 
+1

Cualquier razón para que no se derrumbaría cosas como la identificación del usuario en atributos? es decir: ' ...' –

+0

Si está llamando a un servicio web que no es de SOAP, es posible que necesite un XML con el mismo formato. –

+0

el formato no está en mis manos. – mrblah

Respuesta

11

Desde XDocument se toma, aquí hay una XmlWriter respuesta:

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(); 

O con 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(); 
+0

Estoy bastante seguro de que el método XmlWriter es el más rápido también, al menos se basa en los puntos de referencia que he hecho. El WCF DataContractSerializer también es rápido, si desea serializar un modelo de objetos en lugar de generar el XML directamente. –

+0

+10 a Marc. No solo por la respuesta sino también por el esfuerzo de explicar ambos enfoques tal como están. – Dienekes

4

ver LINQ to XMl manera de hacer eso, algo como esto

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

11

clase de uso XDocument, por lo que el código será como

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") 

     ) 
    ) 
); 
1
  1. Escribir un esquema XML que describe su estructura. (También puede usar xsd.exe para generar automáticamente el esquema según un archivo XML dado.)
  2. Use xsd.exe /classes para generar clases C# de acuerdo con su esquema XML.
  3. Ahora puede usar la clase XmlSerializer para serializar/deserializar su XML desde/hacia una estructura de objeto C#.

También hay un codeproject article que describe este enfoque.

+0

También se trata del método más lento de todos los mencionados. –

+1

Supongo que el enfoque de XmlDocument es incluso más lento ... De todos modos, lo que me gusta es que todo está fuertemente tipado e incluso se puede hacer una validación de esquema. – Vinz

0

me gustaría ir con el LINQ to XML sugerencias, pero por lo completo que sólo hay que añadir la siguiente:

var xe = XElement.Parse("<order><user>2343</user><creditcardtype>2333</creditcarttype><country>USA</country><orderDetails><amount>23434</amount><shipping>32</shipping></orderDetails></order>"); 

:)