我有一个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"获取颜色。
您可以尝试:
var part = xdoc.Descendants("Parts")
.FirstOrDefault(x => (string)x.Attribute("fpartno") == "0223");
if(part != null)
{
var values = part.Descendants("Values");
}
这是我提出的解决方案。
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);
}
}
这是XPath:的Raison d’être
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来混合XPath和XDocument。CreateNavigator创建一个XPathNavigator,然后可以使用XPath对其进行查询。