XML中的所有子节点都链接到一个父节点

问题描述:

我试图修复一段代码,它没有做我想做的事情。该代码由一位声称工作完美的工程师留下。他一直在使用XPATH而不是Linq,所以在短期内我正在寻找基于XPATH的解决方案。XML中的所有子节点都链接到一个父节点

我搜索了网页,但无法将我发现的内容转换为工作解决方案。

的XML看起来像:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Orders> 
    <Order> 
     <OrderId>6175</OrderId> 
     <OrderNumber>6175</OrderNumber> 
     <OrderDate>2016-08-19 13:17:41</OrderDate> 
     <OrderLineItems> 
      <ItemName>Name of Item</ItemName> 
      <Quantity>1</Quantity> 
      <Meta/> 
     </OrderLineItems> 
    </Order> 
</Orders> 

他与Visual Studio 2008中的担忧读取XML看起来像创建的脚本:

public override void CreateNewOutputRows() 
    { 
     string filename = Variables.strFileInLoop; 

     XmlDocument doc = new XmlDocument(); 
     doc.Load(filename); 


     // loop orders 
     foreach (XmlNode shipmentNode in doc.DocumentElement.SelectNodes("/Orders/Order")) 
     { 
      OutputOrdersBuffer.AddRow(); 
      String OrderId = GetNodeText("OrderId", shipmentNode).Trim(); 
      OutputOrdersBuffer.OrderId = OrderId; 
      OutputOrdersBuffer.OrderNumber = GetNodeText("OrderNumber", shipmentNode).Trim(); 
      OutputOrdersBuffer.OrderDate = GetNodeText("OrderDate", shipmentNode).Trim(); 
      String replace = @"C:\Projects\Customername\IN\"; 
      OutputOrdersBuffer.FileName = filename.Replace(replace, ""); 

       foreach (XmlNode OrderLineItemNode in shipmentNode.SelectNodes("/Orders/Order/OrderLineItems")) 
       { 
        OutputOrderLinesBuffer.AddRow(); 
        OutputOrderLinesBuffer.OrderId = OrderId; 
        OutputOrderLinesBuffer.ItemName = GetNodeText("ItemName", OrderLineItemNode).Trim(); 
        OutputOrderLinesBuffer.Quantity = GetNodeText("Quantity", OrderLineItemNode).Trim(); 
        OutputOrderLinesBuffer.Meta = GetNodeText("Meta", OrderLineItemNode).Trim(); 

       } 

     } 
    } 

当我们尝试导入多的XML会发生什么订单是代码将所有OrderLineItems附加到所有订单。

所以,如果有2个OrderLineItems的文件中有10个独特的订单,它会发出10个订单,每个订单有20个OrderLineItems。

正如我所说,我到处寻找(我认为),但无法将我发现的解决方案转换为OrderLineItems仅与其所属订单链接的解决方案。

+0

也许你应该使用OutputOrdersBuffer.OutputOrderLinesBuffer.AddRow();等等...... – Fruchtzwerg

的顺序内的迭代使用一个的XPath表达式

/Orders/Order/OrderLineItems 

穿过整个文档每时间的推移,作为起始/中表示。这就是为什么所有订单项都包含在所有订单中的原因。

更改的XPath表达采取shipmentNode作为上下文项,如果的XPath表达不以/开始其隐含发生,并从那里导航到其OrderLineItems孩子应该帮助:

foreach (XmlNode OrderLineItemNode in shipmentNode.SelectNodes("OrderLineItems")) 

与命令行上的文件系统的类比通常有助于在启动时XPath:上下文项的行为与工作目录类似,可以使用绝对路径更改目录(startin g与/),或者与当前目录的相对路径(从./开始,这也适用于XPath)。当然XPath不同,因为它是面向集合的,但这种类比有助于进入正确的导航思维模式。

+0

谢谢!这样可行!我一直在寻找几天,我发现它必须是Xpath表达式中的某些东西,但永远不能弄清楚什么。刚刚尝试了25个订单和28个行的文件,而不是获得700个订单,输出是我需要的!太感谢了!!! –