C# 挑战重构XML

C# 挑战重构XML,c#,xml,linq,C#,Xml,Linq,我有一个如下所示的XML文件: <SalesOrders> <Header> <CustomerID>456554</CustomerID> <BuyerID>312</BuyerID> <OrderNbr>S392392</OrderNbr> </Header> <Item> <It

我有一个如下所示的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>
我想重新构造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的新手。