我正在尝试使用LinQ读取复杂的XML文件。
XML文件有很多级别,如何在一个ILIST中获取所有值<> 。项目中有更多标记。enter code here
XML具有以下语法:
<root>
<items>
<index_0>
<product_id>19</product_id>
<menu_rank>2</menu_rank>
<menu_country>Guatemala</menu_country>
<menu_country_code>502</menu_country_code>
<menu_country_abrv>GT</menu_country_abrv>
<menu_carrier>TIGO</menu_carrier>
<menu_value>7.0</menu_value>
</index_0>
<index_1>
<product_id>20</product_id>
<menu_rank>2</menu_rank>
<menu_country>Guatemala</menu_country>
<menu_country_code>502</menu_country_code>
<menu_country_abrv>GT</menu_country_abrv>
<menu_carrier>TIGO</menu_carrier>
<menu_value>10.0</menu_value>
</index_1>
<index_2>
<product_id>21</product_id>
<menu_rank>2</menu_rank>
<menu_country>Guatemala</menu_country>
<menu_country_code>502</menu_country_code>
<menu_country_abrv>GT</menu_country_abrv>
<menu_carrier>TIGO</menu_carrier>
<menu_value>14.0</menu_value>
</index_2>
</items>
</root>
我尝试过这种方法但没有成功:
var chartrate = from a in xmlDoc.Descendants("items")
select new
{
sub_id = a.Element("product_id").Value,
product = a.Element("menu_rank").Value,
description = a.Element("menu_country").Value
} ;
有什么建议吗?
答案 0 :(得分:0)
我看到的最大问题是product_id
,menu_rank
和menu_country
都是items
的元素
解决此问题的最佳方法实际上是更改XML架构,如果可以的话,它实际上代表了items
元素的列表。
<root>
<items>
<product_id>19</product_id>
<menu_rank>2</menu_rank>
<menu_country>Guatemala</menu_country>
<menu_country_code>502</menu_country_code>
<menu_country_abrv>GT</menu_country_abrv>
<menu_carrier>TIGO</menu_carrier>
<menu_value>7.0</menu_value>
</items>
<items>
<product_id>20</product_id>
<menu_rank>2</menu_rank>
<menu_country>Guatemala</menu_country>
<menu_country_code>502</menu_country_code>
<menu_country_abrv>GT</menu_country_abrv>
<menu_carrier>TIGO</menu_carrier>
<menu_value>10.0</menu_value>
</items>
<items>
<product_id>21</product_id>
<menu_rank>2</menu_rank>
<menu_country>Guatemala</menu_country>
<menu_country_code>502</menu_country_code>
<menu_country_abrv>GT</menu_country_abrv>
<menu_carrier>TIGO</menu_carrier>
<menu_value>14.0</menu_value>
</items>
</root>
执行此操作后,您可以在xml和c#中将items
重命名为item
答案 1 :(得分:0)
这应该有效:
using System.Xml.XPath;
...
var chartrate = from a in xmlDoc.XPathSelectElements ("/root/items/*")
select new
{
sub_id = a.Element("product_id").Value,
product = a.Element("menu_rank").Value,
description = a.Element("menu_country").Value
};
XPath查询选择所有元素,无论其名称如何(请参阅*
元素下的/root/items
)
答案 2 :(得分:0)
这应该有效
var result = X.Element("root")
.Element("items")
.Elements().Where(E => E.Name.ToString().Contains("index"))
.Select(E => new { Id = E.Element("product_id").Value, Country = E.Element("menu_country").Value });
你应该看看Sam我的回答,并尝试修改你的XML。
答案 3 :(得分:0)
您只需要另一级别的间接来检索Index_N元素:
XElement xmlDoc = XElement.Parse(xml);
var chartrate =
from a in xmlDoc.Descendants("items").Elements()
select new
{
sub_id = a.Element("product_id").Value,
product = a.Element("menu_rank").Value,
description = a.Element("menu_country").Value
};
chartrate.Dump();
在LinqPad中,这会产生:
sub_id product description
19 2 Guatemala
20 2 Guatemala
21 2 Guatemala