循环通过DataTable&;为每个唯一项构造Xml
本文关键字:唯一 Xml DataTable amp 循环 | 更新日期: 2023-09-27 18:27:07
我有一个由如下存储过程填充的数据表:
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。
试试这个(你可能会在内联评论中找到一些关于发生了什么的提示):
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));
});
}
}