【问题标题】:Generate xml using LINQ to XML使用 LINQ to XML 生成 xml
【发布时间】:2013-07-05 16:43:14
【问题描述】:

假设我有一个如下所示的类, 如何使用 LINQ to XML 创建如下所示的 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>

【问题讨论】:

  • 而不是 LINQ to XML...更合适的是 XML 序列化器...而且非常简单。
  • @vivek 我完全不同意。

标签: c# xml linq


【解决方案1】:

虽然您可以使用 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);

【讨论】:

  • 这实际上回答了所提出的问题。
【解决方案2】:

您不需要 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");

【讨论】:

  • 感谢您的回复,在我的实际需求中,它需要添加大量静态属性作为数据类型、命名空间。我可以使用 Linq to XML 实现这一点吗?
  • 我是这么认为的,Linq To XML 只是使用 linq 语句读取 xml。要保存它,您可以使用序列化(在我的选项中,很容易做到)或 XmlDocument 和 XmlWriter 来做(很好但很难做到)。
  • 您可以使用 LINQ to XML 创建和保存 XML,并且代码比所有 XML 序列化的东西都简单得多。
【解决方案3】:

你必须尊重等级制度。

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

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

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

【讨论】:

  • 谢谢 Riba,我认为 XmlDocument 是要走的路
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
相关资源
最近更新 更多