如果先前兄弟中的元素是某个值XML,请选择Next Sibling

时间:2017-07-12 16:58:11

标签: c# xml

我有以下XML文件

<ProdExtract>
<Product>
  <Barcode>         
    <Eancode>0000000000000</Eancode>        
  </Barcode>                    
  <Barcode>         
    <Eancode>0000000000000</Eancode>        
  </Barcode>                          
  <Barcode>         
    <Eancode>5391524344444</Eancode>        
  </Barcode>
</Product>

<Product>                                                  
  <Barcode>         
    <Eancode>5391524322222</Eancode>        
  </Barcode>
</Product>
</ProdExtract>

所需的输出是获取两种产品的Eancode。 对于第一个产品,要跳过所有零条形码并选择/输出该产品的下一个有效Eancode(5391524344444)。对于第二个产品输出有效的默认Eancode(5391524322222)。

默认情况下,这就是我为只有一个条形码节点的产品提取Eancode的方式

p.q_barcode = node.SelectSingleNode("Barcode/Eancode").FirstChild.InnerText;

问题是在提取下一个有效值之前处理具有多个无效零值Eancodes的产品。

使用当前代码

XmlDocument xDoc = new XmlDocument();
xDoc.Load(data);
XmlElement root = xDoc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("Product");

foreach (XmlNode node in nodes)                        
{

   var noneZeroEancode = xml.Descendants("Eancode").Where(x => x.Value != "0000000000000");
   string outputString = eancode.First().Value;
   p.q_barcode = outputString;
   //other properties....
   p.q_description = node.SelectSingleNode("ProductID/LongDescription").InnerText;
   //insert record into table
   //go read next "Product" node (if any)
}

输出结果:在读取第二个节点时,它将第一个Eancode的值分配给第二个产品。因此,以下所有产品的Eancode值均为5391524344444,而不是其自身的唯一值。

其他信息(仅为了清晰起见): 此功能位于一个循环中,该循环读取每个产品节点,将值映射到表列并导入记录/产品,然后继续读取下一个节点。 这部分无需回答,因为我解决了这个问题。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

using System;
using System.Linq;
using System.Xml.Linq;

namespace xml {
    class Program {
        static void Main(string[] args) {
            var data =
@"<ProdExtract>
    <Product>
        <Barcode>         
          <Eancode>0000000000000</Eancode>        
        </Barcode>
    </Product>
    <Product>
        <Barcode>         
          <Eancode>0000000000000</Eancode>        
        </Barcode>
    </Product>
    <Product>       
        <Barcode>         
          <Eancode>5391524344444</Eancode>        
        </Barcode>
    </Product>
</ProdExtract>";

            var xml = XDocument.Parse(data);
            var eancode = xml.Descendants("Eancode").Where(x => x.Value != "0000000000000");
            var product = eancode.Select(x => x.Parent.Parent);
            foreach (var p in product) {
                Console.WriteLine(p);
                }
            }
        }
    }

第一步是选择没有00 ... 0 Eancode值的元素。接下来查看每个返回的节点(XElements)并获取祖父母。

可能的问题: 如果您的XML没有按预期格式化(如果'Eancode'存在但不在'产品/条形码'中),您将无法获得预期的结果,您甚至可以生成获取父级父级的异常。