使用子节点解析XML

时间:2014-04-14 21:49:45

标签: c# xml linq xmlreader xelement

我有一个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的示例,但我还没有找到一个很好的解决方案来循环使用SubTree /子节点。

我尝试过的例子。

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);
} 

但似乎无法弄清楚如何只获得&#34; 0019&#34;的颜色。

3 个答案:

答案 0 :(得分:1)

您可以尝试:

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

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

答案 1 :(得分:0)

这是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。但是,您可以通过使用XDocument.CreateNavigator创建XPathNavigator来混合XPath和XDocument,然后可以使用XPath进行查询。

答案 2 :(得分:0)

这是我提出的解决方案。

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);
    }
}