【发布时间】:2016-08-25 08:06:39
【问题描述】:
我正在尝试修复一段没有按照我的意愿执行的代码。该代码是由一位声称它运行良好的工程师留下的。他一直在使用 XPATH 而不是 Linq,所以短期内我正在寻找基于 XPATH 的解决方案。
我在网上搜索过,但无法将我找到的内容转换为可行的解决方案。
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 时,代码会将所有 OrderLineItem 附加到所有订单。
因此,如果文件中有 10 个具有 2 个 OrderLineItems 的唯一订单,则它会输出 10 个订单,每个订单有 20 个 OrderLineItems。
正如我所说,我到处寻找(我认为),但无法将我发现的内容转换为 OrderLineItems 仅链接到它们所属的订单的解决方案。
【问题讨论】:
-
也许你应该使用 OutputOrdersBuffer.OutputOrderLinesBuffer.AddRow();等等...