解析 XML 个节点导致列出所有相同的项目
Parsing XML Nodes result in list all of the same item
我在以前的项目中 运行 遇到过这个问题,但一直不明白为什么会发生这种情况,如果能提供这方面的任何信息以及如何始终避免该问题,我将不胜感激。
我有一份来自 eBay 的 XML 格式的库存报告。我正在将 SKU 节点解析为一个列表,以确定我们库存中的哪些产品未在 eBay 上列出。
下面的代码片段生成了一个列表,所有的 SKU 都相同。我已验证 XmlNodeList 中填充了大约 8000 个唯一字符串。我相信该错误与引擎盖下的指针/引用类型的问题有关。就像我正在使用临时内存 space 来存储 XmlNode 对象并且 returnList 指向该内存位置,而不是做一个 memcpy 类型t运行sfer 字符串到列表中的操作。
任何指点将不胜感激。
样本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 文档中创建绝对路径,因此它每次都会以某种方式或其他方式检索第一个节点。删除它解决了问题。更正后的代码:
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的评论。 Post回答,我会欣然接受。
我在以前的项目中 运行 遇到过这个问题,但一直不明白为什么会发生这种情况,如果能提供这方面的任何信息以及如何始终避免该问题,我将不胜感激。
我有一份来自 eBay 的 XML 格式的库存报告。我正在将 SKU 节点解析为一个列表,以确定我们库存中的哪些产品未在 eBay 上列出。
下面的代码片段生成了一个列表,所有的 SKU 都相同。我已验证 XmlNodeList 中填充了大约 8000 个唯一字符串。我相信该错误与引擎盖下的指针/引用类型的问题有关。就像我正在使用临时内存 space 来存储 XmlNode 对象并且 returnList 指向该内存位置,而不是做一个 memcpy 类型t运行sfer 字符串到列表中的操作。
任何指点将不胜感激。
样本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 文档中创建绝对路径,因此它每次都会以某种方式或其他方式检索第一个节点。删除它解决了问题。更正后的代码:
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的评论。 Post回答,我会欣然接受。