我这里有一个 XML 文件块。我想获取 ToyId 的所有实例并将其放入一个数组中。以及仅获取具有“Hastoys =“YES””属性的节点。
'
<Bookstore Hastoys="YES">
<Authors>7</Authors>
<Location>Austin TX</Location>
<Employees>15</Employees>
<ToyList>
<ToyId>124</ToyId>
<ToyId>1251</ToyId>
</ToyList>
<ToyList>
<ToyId>255-2</ToyId>
<ToyId>6623</ToyID>
</ToyList>
</Bookstore>
var list = from r in doc.Descendants("Bookstore")
.Where(node => (string)node.Attribute("HasToys") == "YES")
select new
{
ToyId = r.Element("ToyList")?.Element("ToyId")?.Value,
};
'
我尝试使用上面的查询,但它只返回玩具 ID 的第一个实例然后转到下一个块。所以输出将是:124,并跳过其他 toyids。
您的 XML 中的一些问题/疑虑:
<ToyId>6623</ToyID>
Bookstore
元素中的属性是“Hastoys”<Bookstore Hastoys="YES">
但是你的代码是指“HasToys”
(string)node.Attribute("HasToys") == "YES"
方法 1
假设您解决了上述问题/疑虑,使用
.Descendants("ToyList").Elements("ToyId")
将每个 ToyId
元素置于 ToyList
元素下。
string xml = @"<Bookstore HasToys=""YES"">
<Authors>7</Authors>
<Location>Austin TX</Location>
<Employees>15</Employees>
<ToyList>
<ToyId>124</ToyId>
<ToyId>1251</ToyId>
</ToyList>
<ToyList>
<ToyId>255-2</ToyId>
<ToyId>6623</ToyId>
</ToyList>
</Bookstore>";
XDocument doc = XDocument.Parse(xml);
var list = (from r in doc.Descendants("Bookstore")
.Where(node => (string)node.Attribute("HasToys") == "YES")
.Descendants("ToyList")
.Elements("ToyId")
select new
{
ToyId = r.Value,
});
方法 2
您也可以使用 XPath
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode root = doc.DocumentElement;
var list = root.SelectNodes("//Bookstore[@HasToys='YES']/ToyList/ToyId").Cast<XmlNode>()
.Select(x => new
{
ToyId = x.InnerText
})
.ToList();