最好的.net方法来创建XML文档

sca*_*cci 17 .net c# xml

我试图找出编写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 ...它也非常适合查询.


Jos*_*osh 9

我建议使用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)


mar*_*c_s 5

那怎么办:创建一个“ 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相比,使用对象然后将它们序列化到磁盘似乎容易得多。