1

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

4 回答 4

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。

于 2013-05-23T16:52:11.773 回答
0

我看到的最大问题是product_id, menu_rank, 也不menu_countryitems

解决此问题的最佳方法可能是在可能的情况下更改 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# 中重命名itemsitem

于 2013-05-23T16:39:43.730 回答
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 
于 2013-05-23T16:53:16.177 回答
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

于 2013-05-23T16:46:08.687 回答