我正在尝试找出编写XML文档的最佳方法。下面是我试图从我们的ERP系统中拉出的数据中创建的一个简单示例。我读过关于XMLWriter的文章,但我想看看有没有其他更好的方法。任何建议都将不胜感激。
示例XML:
<?xml version="1.0"?>
<Orders>
<Order OrderNumber="12345">
<ItemNumber>0123993587</ItemNumber>
<QTY>10</QTY>
<WareHouse>PA019</WareHouse>
</Order>
<Order OrderNumber="12346">
<ItemNumber>0123993587</ItemNumber>
<QTY>9</QTY>
<WareHouse>PA019</WareHouse>
</Order>
<Order OrderNumber="12347">
<ItemNumber>0123993587</ItemNumber>
<QTY>8</QTY>
<WareHouse>PA019</WareHouse>
</Order>
</Orders>发布于 2010-01-16 15:33:09
Josh的回答显示了在LINQ to XML中创建单个元素是多么容易……它并没有显示出创建多个元素是多么容易。假设您有一个名为orders的List<Order> ...您可以像这样创建整个文档:
var xml = new XElement("Orders",
orders.Select(order =>
new XElement("Order",
new XAttribute("OrderNumber", order.OrderNumber),
new XElement("ItemNumber", order.ItemNumber),
new XElement("QTY", order.Quantity),
new XElement("Warehouse", order.Warehouse)
)
)
);LINQ to XML使得构建XML变得非常简单。它还支持XML名称空间,这也很容易。例如,如果您希望元素位于特定的名称空间中,则只需:
XNamespace ns = "http://your/namespace/here";
var xml = new XElement(ns + "Orders",
orders.Select(order =>
new XElement(ns + "Order",
... (rest of code as before)LINQ to XML是我使用过的最好的XML API ...这对于查询来说也是很棒的。
发布于 2010-01-16 14:57:21
我建议使用System.Xml.Linq.dll中的类,其中包含一个XML DOM,由于构造器的设计方式,它允许轻松构建XML结构。尝试使用System.Xml类创建XML结构是非常痛苦的,因为您必须分离地创建它们,然后将它们单独添加到文档中。
从零开始创建DOM的XLinq与System.Xml的Here's an example。当您看到System.Xml示例时,您的眼睛会滴血。
这里有一个快速示例,说明如何使用XLinq构建文档的一部分。
var xml = new XElement("Orders",
new XElement("Order",
new XAttribute("OrderNumber", 12345),
new XElement("ItemNumber", "01234567"),
new XElement("QTY", 10),
new XElement("Warehouse", "PA019")
)
);提示虽然它有点不正统(尽管并不比最近流行的一些语言屠杀更糟糕),但我有时会使用C#的类型别名功能来进一步减少代码:
using XE = System.Xml.Linq.XElement;
using XA = System.Xml.Linq.XAttribute;
...
var xml = new XE("Orders",
new XE("Order",
new XA("OrderNumber", 12345),
new XA("ItemNumber", "01234567"),
new XA("QTY", 10),
new XA("Warehouse", "PA019")
)
);发布于 2010-01-16 18:02:19
这样如何:创建一个类"Order“和一个"Orders",然后将它们序列化为XML --对我来说,这似乎比手工一点一点地创建XML容易得多。
既然您说要从ERP中提取数据,那么您可能已经有了"Order“等的对象和类--也许在您的类上添加一些XmlElement属性就足够了,您就可以开始工作了!
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace XmlLinqTest
{
[Serializable]
[XmlRoot(Namespace = "")]
public class Orders
{
private List<Order> _orders = new List<Order>();
/// <remarks/>
[XmlElement("Order")]
public List<Order> OrderList
{
get { return _orders; }
}
}
/// <remarks/>
[Serializable]
public class Order
{
/// <remarks/>
[XmlElement]
public string ItemNumber { get; set; }
[XmlElement]
public int QTY { get; set; }
/// <remarks/>
[XmlElement]
public string WareHouse { get; set; }
/// <remarks/>
[XmlAttribute]
public string OrderNumber { get; set; }
}
}在你的主应用中是这样的:
Orders orders = new Orders();
Order work = new Order() { ItemNumber = "0123993587", OrderNumber = "12345", QTY = 10, WareHouse = "PA019" };
orders.OrderList.Add(work);
work = new Order() { ItemNumber = "0123993587", OrderNumber = "12346", QTY = 9, WareHouse = "PA019" };
orders.OrderList.Add(work);
work = new Order() { ItemNumber = "0123993587", OrderNumber = "12347", QTY = 8, WareHouse = "PA019" };
orders.OrderList.Add(work);
XmlSerializer ser = new XmlSerializer(typeof(Orders));
using(StreamWriter wr = new StreamWriter(@"D:\testoutput.xml", false, Encoding.UTF8))
{
ser.Serialize(wr, orders);
}在我看来,使用对象然后将它们序列化到磁盘上要比摆弄XDocument和其他API容易得多。
https://stackoverflow.com/questions/2076442
复制相似问题