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 に答える