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仅与其所属订单链接的解决方案。
的顺序内的迭代使用一个的XPath表达式
/Orders/Order/OrderLineItems
穿过整个文档每时间的推移,作为起始/
中表示。这就是为什么所有订单项都包含在所有订单中的原因。
更改的XPath表达采取shipmentNode
作为上下文项,如果的XPath表达不以/
开始其隐含发生,并从那里导航到其OrderLineItems
孩子应该帮助:
foreach (XmlNode OrderLineItemNode in shipmentNode.SelectNodes("OrderLineItems"))
与命令行上的文件系统的类比通常有助于在启动时XPath:上下文项的行为与工作目录类似,可以使用绝对路径更改目录(startin g与/
),或者与当前目录的相对路径(从./
开始,这也适用于XPath)。当然XPath不同,因为它是面向集合的,但这种类比有助于进入正确的导航思维模式。
谢谢!这样可行!我一直在寻找几天,我发现它必须是Xpath表达式中的某些东西,但永远不能弄清楚什么。刚刚尝试了25个订单和28个行的文件,而不是获得700个订单,输出是我需要的!太感谢了!!! –
也许你应该使用OutputOrdersBuffer.OutputOrderLinesBuffer.AddRow();等等...... – Fruchtzwerg