解析 XML 节点会导致列出所有相同的项目

本文关键字:项目 节点 XML 致列 解析 | 更新日期: 2023-09-27 18:36:00

我在以前的项目中遇到过这个问题,但一直不明白为什么会发生这种情况,并希望在这方面提供任何信息,以及如何始终避免这个问题。

我有一份来自 eBay 的 XML 格式的库存报告。 我正在将 SKU 节点解析为列表,以确定我们在库存中有哪些产品未在 eBay 上列出。

下面的代码片段会生成一个列表,所有 SKU 都相同。 我已经验证了 XmlNodeList 填充了大约 8000 个唯一字符串。 我相信该错误与引擎盖下的指针/参考类型的问题有关。就像我使用临时内存空间来存储 XmlNode 对象并且 returnList 指向该内存位置一样,而不是执行 memcpy 类型的操作将字符串传输到列表中。

任何指示将不胜感激。

示例 XML:

<?xml version="1.0" encoding="utf-8"?>
<BulkDataExchangeResponses xmlns="urn:ebay:apis:eBLBaseComponents">
    <ActiveInventoryReport>
        <SKUDetails>
            <SKU>FAKE0012</SKU>
            <Price currencyID="USD">5.99</Price>
            <Quantity>12</Quantity>
            <ItemID>123456789123</ItemID>
        </SKUDetails>               
    </ActiveInventoryReport>
</BulkDataExchangeResponses>

代码清单:

private List<string> getListingsFromXML(string fileName)
    {
        List<string> returnList = new List<string>();
        XmlDocument doc = new XmlDocument();
        XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
        ns.AddNamespace("ebay", "urn:ebay:apis:eBLBaseComponents");
        doc.Load(fileName);
        XmlElement root = doc.DocumentElement;
        XmlNode node = root.SelectSingleNode("//ebay:ActiveInventoryReport",ns);
        XmlNodeList skus = node.SelectNodes("//ebay:SKUDetails",ns);
        foreach (XmlNode sku in skus)
        {
            XmlNode tempNode = sku.SelectSingleNode("//ebay:SKU",ns);
            if (tempNode != null)
            {
                //tempNode.InnerText is always the first SKU in skus
                //sku iterates through list as expected.
                returnList.Add(tempNode.InnerText.Trim());
            }
        }
        return returnList;
    }

解析 XML 节点会导致列出所有相同的项目

我发现了我的问题。//在 XML 文档中创建绝对路径,以便它每次都以某种方式或其他方式检索第一个节点。 删除它解决了问题。 更正的代码:

private List<string> getListingsFromXML(string fileName)
    {
        List<string> returnList = new List<string>();
        XmlDocument doc = new XmlDocument();
        XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
        ns.AddNamespace("ebay", "urn:ebay:apis:eBLBaseComponents");
        doc.Load(fileName);
        XmlElement root = doc.DocumentElement;
        XmlNode node = root.SelectSingleNode("//ebay:ActiveInventoryReport", ns);
        XmlNodeList skus = node.SelectNodes("//ebay:SKUDetails", ns);
        foreach (XmlNode sku in skus)
        {
            XmlNode tempNode = sku.SelectSingleNode("ebay:SKU", ns);
            if (tempNode != null)
            {
                returnList.Add(tempNode.InnerText.Trim());
            }
        }
        return returnList;
    }

提交答案后,我看到了@wero的评论。 发布答案,我很乐意接受。