[英]Parse XML with Child Nodes
我有一個 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");
}
這是 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 進行查詢。
這是我想出的解決方案。
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.