7

Suppose that I have a class that looks like below, how do I create xml like below using LINQ to XML?

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>
4

3 回答 3

21

虽然您可以使用 XmlSerialization,但在很多情况下,使用 LINQ to XML 也同样简单,并且不会将您的类实现锁定在单个序列化方案中。这是处理您的请求的一些代码。

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);
于 2013-07-05T17:14:21.993 回答
5

您不需要 linq 来生成此 xml,您可以使用 linq 生成一个collection并序列化 xml 文件中的集合。

在序列化之前,您应该Serializable在类中添加属性:

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

看看这里如何自定义您的序列化(使用属性): http: //msdn.microsoft.com/en-us/library/58a18dwa (v=vs.80).aspx

创建一个这样的方法来序列化:

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

并反序列化:

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;
}

并使用它:

// 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");
于 2013-07-05T16:48:16.837 回答
2

你必须尊重等级制度。

序列化这个 XML,我们会得到这样的东西:

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

我认为在这种情况下,您将不得不自己编写读取对象并使用 XmlDocument、XElement 或 StringBuilder 生成 XML。

于 2013-07-05T16:47:36.990 回答