使用linq读取复杂的XML文件

时间:2013-05-23 16:34:59

标签: c# xml linq

我正在尝试使用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
                } ;

有什么建议吗?

4 个答案:

答案 0 :(得分:0)

我看到的最大问题是product_idmenu_rankmenu_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