【问题标题】:All Child Nodes in XML are linked to a Parent NodeXML 中的所有子节点都链接到父节点
【发布时间】: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();等等...

标签: c# xml xpath


【解决方案1】:

订单内的迭代使用 XPath 表达式

/Orders/Order/OrderLineItems

每次都会遍历整个文档,如开头的/ in 所示。这就是所有订单项都包含在所有订单中的原因。

更改 XPath 表达式以将 shipmentNode 作为上下文项,如果 XPath 表达式不以 / 开头并从那里的OrderLineItems 孩子们应该帮忙:​​

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

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

【讨论】:

  • 谢谢!这样可行!我已经搜索了几天,我认为它必须是 Xpath 表达式中的东西,但永远无法弄清楚是什么。刚刚尝试了一个包含 25 个订单和总共 28 行的文件,而不是得到 700 个订单行,我需要的是输出!谢谢一百万!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
相关资源
最近更新 更多