我试图找出编写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>
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 29
Josh的回答显示了在LINQ to XML中创建单个元素是多么容易......它没有显示创建多个元素也非常容易.假设你有一个List<Order>被叫orders...你可以像这样创建整个文档:
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)
));
);
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
LINQ to XML是我使用过的最好的XML API ...它也非常适合查询.
我建议使用System.Xml.Linq.dll中的类,这些类包含XML DOM API,由于构造器的设计方式,它允许轻松构建XML结构.尝试使用System.Xml类创建XML结构非常痛苦,因为您必须创建它们分离然后单独将它们添加到文档中.
以下是XLinq与System.Xml 的示例,用于从头开始创建DOM.当您看到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")
)
);
Run Code Online (Sandbox Code Playgroud)
提示虽然它有点非正统(虽然不比最近流行的一些语言屠宰更糟糕),但我偶尔使用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")
)
);
Run Code Online (Sandbox Code Playgroud)
那怎么办:创建一个“ Order”类和一个“ Orders”,然后将其序列化为XML,这对我来说比手动创建XML容易得多。
因为您说要从ERP提取数据,所以您可能已经有了“订单”的对象和类,依此类推-也许在类上放置一些[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; }
}
}
Run Code Online (Sandbox Code Playgroud)
在您的主应用程序中,如下所示:
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);
}
Run Code Online (Sandbox Code Playgroud)
与摆弄XDocument和其他API相比,使用对象然后将它们序列化到磁盘似乎容易得多。
| 归档时间: |
|
| 查看次数: |
21914 次 |
| 最近记录: |