【问题标题】:Parse XML with Child Nodes使用子节点解析 XML
【发布时间】:2014-04-14 21:49:45
【问题描述】:

我有一个 XML 文件,它返回包含颜色的产品列表和每种颜色的库存。对于特定产品(即 PL-0223)仅按颜色返回库存的最佳方法是什么?

这是数据。

<Part fpartno="0019">
    <Color colorname="Nickel"> 
        <ValueAmt>
            <Values Qty= "12101" Date ="ATP" Type= "Avail"/>
            <Values Qty= "12101" Date= "Total" Type="Total"/> 
        </ValueAmt>
    </Color>
</Part>
<Part fpartno="0223">
    <Color colorname="White"> 
        <ValueAmt>
            <Values Qty= "0" Date ="ATP" Type= "Avail"/>
            <Values Qty= "0" Date= "Total" Type="Total"/> 
        </ValueAmt>
    </Color>
    <Color colorname="Yellow"> 
        <ValueAmt>
            <Values Qty= "0" Date ="ATP" Type= "Avail"/>
            <Values Qty= "0" Date= "Total" Type="Total"/> 
        </ValueAmt>
    </Color>
</Part>

我已经看到了使用 Linq to SQL 和 XmlReader 的示例,但我还没有找到一个好的解决方案来循环遍历子树/子节点。

我尝试过的示例。

XmlReader 方法。我似乎无法弄清楚如何获取子元素。

using(XmlReader r = XmlReader.Create(URLString))
{
    while(r.Read())
    {
        if((r.NodeType == XmlNodeType.Element) && (r.Name == "Part"))
        {
            if(r.HasAttributes)
            {                    
                if(r.GetAttribute("fpartno") == "0019")
                {
                    using (XmlReader cr = r.ReadSubtree())
                    {
                        Console.WriteLine(cr.Name)
                    }
                }
            }
        }
    }
}

我也试过 XDoc

XDocument xdoc = XDocument.Load(URLString);
foreach (XElement element in xdoc.Descendants("Values"))
{
    Console.WriteLine(element);
} 

但似乎无法弄清楚如何仅获取“0019”的颜色。

【问题讨论】:

  • 请不要只求我们为您解决问题。向我们展示如何尝试自己解决问题,然后向我们确切地展示结果是什么,并告诉我们您为什么觉得它不起作用。请参阅“What Have You Tried?”了解您真正需要阅读的优秀文章。
  • 我添加了编辑。我是 XML 解析的新手,因此缺乏详细的帖子,因此似乎没有收到反对票。

标签: c# xml linq xmlreader xelement


【解决方案1】:

你可以试试:

var part = xdoc.Descendants("Parts")
             .FirstOrDefault(x => (string)x.Attribute("fpartno") == "0223");

if(part != null)
{
   var values = part.Descendants("Values");
}

【讨论】:

    【解决方案2】:

    这是我想出的解决方案。

    string URLString = "http://example.com/test.xml";
    XElement xelement = XElement.Load(URLString);
    var part = from partno in xelement.Descendants("Part")
               where (string)partno.Attribute("fpartno") == "0019"
               select partno;
    
    foreach (XElement xEle in part)
    {
        Console.log(xEle.Element("Color").Attribute("colorname").Value);
    
        foreach (var node in xEle.Element("Color").Element("ValueAmt").Elements("Values"))
        {
            Console.log(node.Attribute("Qty").Value);
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是 XPath 存在的理由:

      var doc = new System.Xml.XmlDocument();
      doc.Load(URLString);
      
      foreach(System.Xml.XmlNode node in 
         doc.SelectNodes("//Part[@fpartno='0223']/Color[@colorname='White']/ValueAmt/Values")
      {
        Console.WriteLine(node.InnerXml);
      }
      

      请注意,您上面的示例数据不是有效的 XML 文档 - 它是一个 Xml 片段。要在其上使用 XPath,您需要将数据包装在根节点中,以便生成的文档有一个根(除非它已经有一个您刚刚没有显示的包装器)。如何构造 XPath 查询字符串的一般情况留给学生练习。

      另请注意,XDocument 不支持 XPath - 只有 LINQ 之前的 XmlDocument 类直接支持 XPath。但是,您可以混合使用 XPath 和 XDocument,方法是使用 XDocument.CreateNavigator 创建一个 XPathNavigator,然后您可以使用 XPath 进行查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        相关资源
        最近更新 更多