0

我有一个由这样的存储过程填充的数据表:

 OrderID           UserDefXml
       1           <OrderSet><Order item="XYZ"><Document ShipDate="08/09/2013" TrackingNumber="1Z1"/></Order></OrderSet>      
       1           <OrderSet><Order item="ABC"><Document ShipDate="08/07/2013" TrackingNumber="1Z2"/></Order></OrderSet>

基本上相同的订单会有不同的xml。

我需要为每个唯一的 orderID 提取 XML,添加另一个名为的属性TrackingURL并将其放入文件中(1.xml在本例中),如下所示:

 <OrderSet>
   <Order item="XYZ"><Document ShipDate="08/09/2013" TrackingNumber="1Z1"  TrackingURL="http://ups.com/?TrackingNumber=1Z1" /></Order>
   <Order item="ABC"><Document ShipDate="08/07/2013" TrackingNumber="1Z2" TrackingURL="http://ups.com/?TrackingNumber=1Z2"/></Order>
</OrderSet>

我可以遍历 DataTable,写入文件等;但是我是从 C# 中构造 xml 的新手。你能帮忙提供一些线索吗?

为简单起见,我特意为 TrackingURL 使用了一个虚拟 url。

4

1 回答 1

2

试试这个(你可能会在内联注释中找到一些关于正在发生的事情的提示):

using System;
using System.Data;
using System.Linq;
using System.Xml.Linq;

class Program
{
    const string url = "http://ups.com/?TrackingNumber=";

    static void Main(string[] args)
    {
        // dummy data
        var dt = new DataTable();
        dt.Columns.Add("OrderID", typeof(int));
        dt.Columns.Add("UserDefXml");
        dt.Rows.Add(1, "<OrderSet><Order item=\"XYZ\"><Document ShipDate=\"08/09/2013\" TrackingNumber=\"1Z1\"/></Order></OrderSet>");
        dt.Rows.Add(1, "<OrderSet><Order item=\"ABC\"><Document ShipDate=\"08/07/2013\" TrackingNumber=\"1Z2\"/></Order></OrderSet>");
        dt.Rows.Add(2, "<OrderSet><Order item=\"ABC\"><Document ShipDate=\"08/11/2013\" TrackingNumber=\"1Z3\"/></Order></OrderSet>");

        // define a XDocument and a declaration
        XDocument doc;
        var dec = new XDeclaration("1.0", "utf-8", "yes");

        // parse the rows
        dt.Rows.Cast<DataRow>()
            // grouping by [OrderID]
            .GroupBy(r => r["OrderID"])
            .ToList().ForEach(group =>
            {
                // create a new instance
                doc = new XDocument();
                doc.Document.Declaration = dec;
                var root = new XElement("OrderSet");
                doc.Add(root);

                // parse the group of rows
                group.ToList().ForEach(item =>
                {
                    // add an element based on the XML content in 
                    // the [UserDefXml] column
                    var e = XElement.Parse(item["UserDefXml"].ToString())
                        .Descendants("Order").First();

                    // get the document
                    var document = e.Element("Document");

                    // add the attribute
                    XAttribute attribute =
                        new XAttribute("TrackingURL",
                            String.Format("{0}{1}",
                                url,
                                document.Attribute("TrackingNumber").Value));
                    document.Add(attribute);

                    // add the element to the document's root
                    root.Add(e);
                });

                // save the file
                doc.Save(String.Format("{0}.xml", group.Key));
            });
    }
}
于 2013-08-09T15:55:24.970 回答