C# 挑战重构XML
我有一个如下所示的XML文件:C# 挑战重构XML,c#,xml,linq,C#,Xml,Linq,我有一个如下所示的XML文件: <SalesOrders> <Header> <CustomerID>456554</CustomerID> <BuyerID>312</BuyerID> <OrderNbr>S392392</OrderNbr> </Header> <Item> <It
<SalesOrders>
<Header>
<CustomerID>456554</CustomerID>
<BuyerID>312</BuyerID>
<OrderNbr>S392392</OrderNbr>
</Header>
<Item>
<Item>E565-14</Item>
<Quantity>65</Quantity>
<Price>33.45</Price>
</Item>
<Item>
<Item>G916-22</Item>
<Quantity>654</Quantity>
<Price>655.22</Price>
</Item>
<Header>
<CustomerID>156557</CustomerID>
<BuyerID>35</BuyerID>
<OrderNbr>S394545</OrderNbr>
</Header>
<Item>
<Item>GS654-88</Item>
<Quantity>78</Quantity>
<Price>2.11</Price>
</Item>
</SalesOrders>
<SalesOrders>
<Order>
<Header>
<CustomerID>456554</CustomerID>
<BuyerID>312</BuyerID>
<OrderNbr>S392392</OrderNbr>
</Header>
<Item>
<Item>E565-14</Item>
<Quantity>65</Quantity>
<Price>33.45</Price>
</Item>
<Item>
<Item>G916-22</Item>
<Quantity>654</Quantity>
<Price>655.22</Price>
</Item>
</Order>
<Order>
<Header>
<CustomerID>156557</CustomerID>
<BuyerID>35</BuyerID>
<OrderNbr>S394545</OrderNbr>
</Header>
<Item>
<Item>GS654-88</Item>
<Quantity>78</Quantity>
<Price>2.11</Price>
</Item>
</Order>
</SalesOrders>
我想重新构造XML,以便在其中包含标题和项目
按如下方式排列节点:
<SalesOrders>
<Header>
<CustomerID>456554</CustomerID>
<BuyerID>312</BuyerID>
<OrderNbr>S392392</OrderNbr>
</Header>
<Item>
<Item>E565-14</Item>
<Quantity>65</Quantity>
<Price>33.45</Price>
</Item>
<Item>
<Item>G916-22</Item>
<Quantity>654</Quantity>
<Price>655.22</Price>
</Item>
<Header>
<CustomerID>156557</CustomerID>
<BuyerID>35</BuyerID>
<OrderNbr>S394545</OrderNbr>
</Header>
<Item>
<Item>GS654-88</Item>
<Quantity>78</Quantity>
<Price>2.11</Price>
</Item>
</SalesOrders>
<SalesOrders>
<Order>
<Header>
<CustomerID>456554</CustomerID>
<BuyerID>312</BuyerID>
<OrderNbr>S392392</OrderNbr>
</Header>
<Item>
<Item>E565-14</Item>
<Quantity>65</Quantity>
<Price>33.45</Price>
</Item>
<Item>
<Item>G916-22</Item>
<Quantity>654</Quantity>
<Price>655.22</Price>
</Item>
</Order>
<Order>
<Header>
<CustomerID>156557</CustomerID>
<BuyerID>35</BuyerID>
<OrderNbr>S394545</OrderNbr>
</Header>
<Item>
<Item>GS654-88</Item>
<Quantity>78</Quantity>
<Price>2.11</Price>
</Item>
</Order>
</SalesOrders>
我熟悉C语言,也知道一些LINQ。我似乎无法从我寻找的在线示例中找到正确的示例。
有没有人能举一个例子来说明如何做到这一点
多谢各位
我很抱歉没有包括代码。这段代码实际上将许多单独的XML文件组合成一个XML文件。我最初的计划是在创建最终的输出XML文件后将Order节点添加到XML中。也许这不是最好的方法?我愿意接受所有建议。代码如下:
public void CombineXMLFiles()
{
string[] XMLFiles = null;
XmlDocument CombineXMLDoc = new XmlDocument();
CombineXMLDoc.LoadXml("<SalesOrders></SalesOrders>");
XMLFiles = Directory.GetFiles("e:\\data\\xml\\", "529485*.xml");
foreach (void FileName_loopVariable in XMLFiles) {
FileName = FileName_loopVariable;
FileInfo FileInfo = new FileInfo(FileName);
if (FileInfo.Length <= 0) {
File.Delete(FileName);
continue;
}
XmlDocument OrderXMLDoc = new XmlDocument();
OrderXMLDoc.Load(FileName);
foreach (XmlNode Node in OrderXMLDoc.DocumentElement.ChildNodes) {
switch (Node.Name.ToUpper) {
case "HEADER":
XmlNode OrderNode = CombineXMLDoc.ImportNode(Node, true);
CombineXMLDoc.DocumentElement.AppendChild(OrderNode);
break;
case "ITEM":
XmlNode OrderNode = CombineXMLDoc.ImportNode(Node, true);
CombineXMLDoc.DocumentElement.AppendChild(OrderNode);
break;
default:
continue;
}
}
}
string dtStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
CombineXMLFileName = "e:\\data\\xml\\output\\" + "STC_" + dtStamp + ".XML";
CombineXMLDoc.Save(CombineXMLFileName);
}
此Linq to XML代码将第一个XML示例转换为第二个XML示例。如果需要从多个文件中拼凑出第一个XML,那么将xdoc拼凑在一起可能比这更复杂 您可以简单地将此逻辑转换为foreach循环。你想做的事一点也不难
var xdoc = XDocument.Parse(xml);
var headersWithItems =
xdoc.Descendants("Header")
.Select(h => new {
Header = h,
Items = h.ElementsAfterSelf().TakeWhile(e => e.Name == "Item") })
;
var salesOrders =
new XElement("SalesOrders",
headersWithItems.Select(
hwi =>
{
var e = new XElement("Order", hwi.Header);
e.Add(hwi.Items.ToArray());
return e;
}
).ToArray()
);
我当然会使用XMLLINQ做一些不同的事情。只是风格不同而已
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement salesOrder = doc.Descendants("SalesOrders").FirstOrDefault();
List<XElement> children = salesOrder.Elements().ToList();
XElement order = null;
foreach (XElement child in children)
{
if (child.Name.LocalName == "Header")
{
order = new XElement("Order");
salesOrder.Add(order);
}
order.Add(child);
child.Remove();
}
}
}
}
您能显示您当前需要帮助的代码吗?所有发布的都是程序说明。然而,我们需要你去。我们不能确定你想从我们这里得到什么。请在您的帖子中加入我们可以回答的有效问题。提醒:请确保您知道,要求我们为您编写程序和建议是离题的。我的代码将许多单独的XML文件附加到一个单独的输出XML文件中。谢谢Ed。Linq代码成功了!我能够将salesOrders变量输出到一个新的XML输出文档中。我仍然认为自己是LINQ的新手。