首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建XML文档的最佳.net方法

创建XML文档的最佳.net方法
EN

Stack Overflow用户
提问于 2010-01-16 14:36:07
回答 11查看 25.6K关注 0票数 21

我正在尝试找出编写XML文档的最佳方法。下面是我试图从我们的ERP系统中拉出的数据中创建的一个简单示例。我读过关于XMLWriter的文章,但我想看看有没有其他更好的方法。任何建议都将不胜感激。

示例XML:

代码语言:javascript
复制
<?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>
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-01-16 15:33:09

Josh的回答显示了在LINQ to XML中创建单个元素是多么容易……它并没有显示出创建多个元素是多么容易。假设您有一个名为ordersList<Order> ...您可以像这样创建整个文档:

代码语言:javascript
复制
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名称空间,这也很容易。例如,如果您希望元素位于特定的名称空间中,则只需:

代码语言:javascript
复制
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 ...这对于查询来说也是很棒的。

票数 33
EN

Stack Overflow用户

发布于 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构建文档的一部分。

代码语言:javascript
复制
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#的类型别名功能来进一步减少代码:

代码语言:javascript
复制
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")
    )
);
票数 11
EN

Stack Overflow用户

发布于 2010-01-16 18:02:19

这样如何:创建一个类"Order“和一个"Orders",然后将它们序列化为XML --对我来说,这似乎比手工一点一点地创建XML容易得多。

既然您说要从ERP中提取数据,那么您可能已经有了"Order“等的对象和类--也许在您的类上添加一些XmlElement属性就足够了,您就可以开始工作了!

代码语言:javascript
复制
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; }
    }
}

在你的主应用中是这样的:

代码语言:javascript
复制
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容易得多。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2076442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档