【发布时间】:2017-07-12 14:24:30
【问题描述】:
我有一个 XML 文件,其中一些记录缺少某些节点/元素(导入表所需的信息)。如果该记录缺少某个节点,那么我设置一个默认值并继续下一条记录。在示例 XML 文件中,产品 A 没有 Barcode 节点,因此根据其他信息生成该值,产品 B 具有所需的所有节点,因此所有值都取自节点。
<ProdExtract>
<Product>
<BasicFields>
<ProductCode>000011</ProductCode>
<LongDescription>Product A</LongDescription>
</BasicFields>
</Product>
<Product>
<BasicFields>
<ProductCode>000012</ProductCode>
<LongDescription>Product B</LongDescription>
</BasicFields>
<Barcode>
<Eancode>5391524344444</Eancode>
</Barcode>
</Product>
</ProdExtract>
我的 C# 代码如下。
foreach (XmlNode node in nodes)
{
XmlNodeList barcodeExists = xDoc.GetElementsByTagName("Product/Barcode");
if (barcodeExists.Count > 0)
{
/*get the inner text of that node*/
p.q_barcode = node.SelectSingleNode("Barcode/Eancode").FirstChild.InnerText;
}
else
{
/* ---
If product has no Barcode node,
Lets set our default value for products without that node
--- */
}
}
现在,当检查通过第一条没有条形码节点的记录时,它将转到else 语句并运行生成值所需的代码并完美地插入第一条记录。在第二次检查所有节点的记录时,它仍然以某种方式跳转到else 并在它应该简单地从“条形码/Eancode”的if 内部文本中获取值时生成一个值。即使交换记录并将产品 B 放在首位,仍然会出现同样的问题。
我什至尝试了以下方法,但仍然没有为产品 B 获得适当的价值
var barcodeExists = node.SelectSingleNode("Product/Barcode");
if (barcodeExists != null)
{
/*Barcode node exists, get the value from that node*/
p.q_barcode = node.SelectSingleNode("Barcode/Eancode").FirstChild.InnerText;
}
【问题讨论】:
-
xDoc.GetElementsByTagName("Product/Barcode")不会总是看first<Product>(按文档顺序)吗?您不应该使用node.SelectSingleNode("Barcode")之类的东西来查找当前node的特定<Barcode>inside 吗? -- 另外,您可能想看看LINQ to XML,它提供了一种更好的方式来处理 XML 数据。 -
var barcodeExists = node.SelectSingleNode("Product/Barcode");看起来几乎正确,但node已经代表<Product>,因此寻找"Product/Barcode"将搜索<Product>inside<Product>.只需从您要查找的路径中删除Product部分,它可能会起作用。所以它会是:var barcodeExists = node.SelectSingleNode("Barcode"); -
@Corak 我以前有
node.SelectSingleNode("Product/Barcode")仍然给我同样的问题,并在您输入时将其更改为node.SelectSingleNode("Barcode")修复了问题。它总是小事。谢谢