检查XML节点是否存在 - 如果节点可用,则循环未找到节点

时间:2017-07-12 14:24:31

标签: c# xml

我有一个XML文件,有些记录缺少某些节点/元素(导入到表中所需的信息)。如果该记录缺少某个节点,则我设置一个默认值并继续下一条记录。在示例XML文件中,产品A没有条形码节点,因此根据其他信息生成该值,产品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并生成一个值,当它应该简单地取出&#34;的if内部文本中的值。条形码/ Eancode&#34 ;.即使交换记录并将产品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;
}

1 个答案:

答案 0 :(得分:1)

要获取节点列表,您只需将节点名称传递给方法GetElementsByTagName

var node = xmlDoc.GetElementsByTagName("Barcode");

附件是在Visual Studio调试器中显示它的值的屏幕截图

enter image description here

另外,添加你的Xml并不完全正确。

我已将其更改为制作合适的Xml。我使用的样品是

<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>

您可以解析与此类似的Xml:

        var nodeList = xmlDoc.GetElementsByTagName("Barcode");

        if (nodeList != null)
        {
            if (nodeList.Count > 0)
            {
                var element = nodeList[0];

                string value = element.InnerText;
            }
        }

基于Xml构建对象的完整方法

此方法中的逻辑是导航Xml并选择所需的值并将其设置为对象。

    private static Product[] GetDetails(XmlDocument xmlDoc)
    {
        var result = new List<Product>();
        XmlNode tempNode;

        var nodeList = xmlDoc.GetElementsByTagName("Product");

        foreach(XmlNode node in nodeList)
        {
            var product = new Product();

            tempNode = node.FirstChild; //BasicFields

            if (tempNode != null)
            {
                product.ProductCode = tempNode["ProductCode"].InnerText;
                product.LongDescription = tempNode["LongDescription"].InnerText;
            }

            if (node.ChildNodes.Count > 1)
            {
                tempNode = node.ChildNodes[1];

                if (tempNode != null)
                {
                    tempNode = tempNode.FirstChild; //Eancode
                    if (tempNode != null)
                    {
                        product.Barcode = tempNode.InnerText;
                    }
                }
            }

            result.Add(product);
        }

        return result.ToArray();
    }

在上面的示例中,Product是一个用于保存数据的简单类

class Product
{
    public string ProductCode { get; set; }
    public string LongDescription { get; set; }
    public string Barcode { get; set; }
}