2013-07-05 30 views
6

Aşağıdaki gibi bir sınıfa sahip olduğumu varsayalım, LINQ to XML kullanarak aşağıdaki gibi nasıl xml oluşturabilirim?XML için LINQ kullanarak xml üret

public class Order 
{ 
    public string OrderNo {get; set;} 
    public string ItemId {get; set;} 
    public string ItemDesc {get; set;} 
    public int Qty {get; set;} 
} 
<orders> 
    <orderid> 
    <orderno>1</orderno> 
    <itemid>W001</itemid> 
    <itemdesc>C# T-Shirst</itemdesc> 
    <quantity>2</quantity> 
    </orderid> 
    <orderid> 
    <orderno>2</orderno> 
    <itemid>W002</itemid> 
    <itemdesc>XML T-Shirt</itemdesc> 
    <quantity>1</quantity> 
    </orderid> 
</orders> 
+1

XML'e LINQ yerine ... daha uygun olan bir XML seri hale getirici olurdu ... ve oldukça önemsiz. – Vivek

+0

@vivek Tamamen yürekten katılmıyorum. –

cevap

4

Bu xml'yi oluşturmak için linq'e ihtiyacınız yoktur, linq'i bir collection oluşturmak ve koleksiyonu bir xml dosyasında serileştirmek için kullanabilirsiniz.

seri önce, sınıfta Serializable özelliği eklemeniz gerekir:

[Serialize] 
public class Order 
{ 
    public string OrderNo {get; set;} 
    public string ItemId {get; set;} 
    public string ItemDesc {get; set;} 
    public int Qty {get; set;} 
} 

(özelliklerini kullanarak) seri özelleştirmek için nasıl burada bir göz atın: http://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.80).aspx

için böyle bir yöntem oluşturun

public statc void SerializeOrders(Order[] orders, string path) 
{ 
    XmlSerializer parse = new XmlSerializer(typeof(Order[])); 
    using (var writer = new StreamWriter(path)) 
    { 
     parse.Serialize(writer, orders); 
     writer.Close(); 
    } 
} 

Ve serisini: serialize

public statc Order[] Deserialize(string path) 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(Order[])); 
    Order[] result; 
    using (XmlReader reader = XmlReader.Create(path)) 
    { 
     result = (Order[]) ser.Deserialize(reader); 
    } 
    return result; 
} 

Ve kullanmalıyım? XmlSerialization kullanabilirsiniz ancak XML LINQ kullanarak gibi kolaydır ve tek içine sınıf uygulaması kilitlemez nerede

// get the collection 
var orders = (from o in Queryable<Order> 
      where o.Something 
      select o).ToArray(); 

    // serializing in xml 
    SerializeOrders(orders, "C:\\result.xml"); 

    // deserializing the xml 
    var serializedOrders = Deserialize("C:\\result.xml"); 
+0

Cevabınız için teşekkürler, gerçek gereksinimimde veri türleri, ad alanı olarak birçok statik özellik eklemeniz gerekiyor. Bunu Linq to XML kullanarak yapabilir miyim? – ryman

+0

Sanırım, Linq To XML, linq ifadelerini kullanarak xml'yi okuyor. Bunu kaydetmek için, seri hale getirme (benim seçeneğim, kolay bir şekilde) veya XmlDocument ve XmlWriter (yapmak için ince ama zor yapmak) kullanabilirsiniz. –

+0

XML'i oluşturmak ve kaydetmek ve XML Serileştirme işlemlerinden daha basit bir koda sahip olmak için LINQ'u XML'e kullanabilirsiniz. Serileştirme için –

2

hiyerarşiyi saygı duymalıyız. Bu XML Dizgeleştirme

, biz böyle bir şey olur:

<Order> 
    <OrderNo></OrderNo> 
    <ItemId></ItemId> 
    ... 
<Order> 

Ben bu durumda düşünüyorum, nesneyi okuma ve XmlDocumentSystem.Xml.XmlNode, XElement veya kullanarak XML üreten kendi üzerine yazmak zorunda kalacak Örneğin StringBuilder.

+0

Teşekkürler Riba, sanırım XmlDocument gitmek için yolu – ryman

+0

Youre welcome @ryman =) – Crasher

18

, vakaların oldukça vardır serileştirme şeması. İsteğinizi işlemek için biraz kod.

var xOrders = new XElement("orders", 
    from o in Orders 
    select new XElement("orderid", 
     new XElement("orderno", order.OrderNo), 
     new XElement("itemid", order.ItemId), 
     new XElement("itemdesc", order.ItemDesc), 
     new XElement("quantity", order.Qty))); 

xOrders.Save(targetPath); 
+0

+1. –

+0

Bu aslında sorulan soruya cevap veriyor. – kwill

İlgili konular