【问题标题】:Linq to XML Get the next node of the same nameLinq to XML 获取下一个同名节点
【发布时间】:2010-08-17 20:36:47
【问题描述】:

这是我的 XML

<assets>
    <asset>
        <metadata Id="ItemType" Value="Image"/>
        <metadata Id="ItemUri" Value="http://blah.png"/>
    </asset>
    <asset>
        <metadata Id="ItemType" Value="Image"/>
        <metadata Id="ItemUri" Value="http://blah2.png"/>
    </asset>
</assets>

如何获取包含 URI 的第二个 &lt;metadata&gt; 值?

List<Asset> assets = (from asset in xmlDocument.Descendants("asset")
                              select new Asset
                              {
                                  ItemType = asset.Element("metadata").Attribute("Value").Value,
                                  ItemUri = asset.Element("metadata").Attribute("Value").Value
                              }).ToList<Asset>();

当然,目前我的代码只是从第一个 &lt;metadata&gt; 返回相同的值。

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    这就是我最终要做的。上面的答案很好,但如果&lt;metadata&gt;s 不正确,那么我会得到错误的数据。这样,无论顺序如何,我都会进行查询并获得正确的查询。

    List<Asset> assets = (from asset in xmlDocument.Descendants("asset")
                                  select new Asset
                                  {
                                      ItemType = asset.Elements().Single(x => x.Attribute("Id").Value == "ItemType").Attribute("Value").Value,
                                      ItemUri = asset.Elements().Single(x => x.Attribute("Id").Value == "ItemUri").Attribute("Value").Value,    
                                  }).ToList<Asset>();
    

    【讨论】:

    • 我会为你做的 ;-) +1 用于与订单无关的解决方案。为这么一个小东西编写这么多代码真是太可悲了:-/但我不知道它怎么能更干净/更小;-)。
    【解决方案2】:

    如果存在多个元素,似乎 .Element(..) 会获取具有匹配名称的第一个元素。 您可以将 linq 查询编辑为类似

    var assets = (from asset in doc.Descendants("asset")
                     let metadata = asset.Descendants("metadata").ToArray()
                     let type = metadata[0].Attribute("Value").Value
                     let uri = metadata[1].Attribute("Value").Value
                     select new Asset { ItemType = type, ItemUri = uri }).ToList();
    

    【讨论】:

      【解决方案3】:
      var assets = (from asset in xmlDocument.Descendants("asset")
                    select new Asset
                    {
                        ItemType = (string)asset.Element("metadata").Attribute("Value"),
                        ItemUri = (string)asset.Elements("metadata").ElementAt(1).Attribute("Value")
                    }).ToList();
      

      【讨论】:

        【解决方案4】:

        这段代码会给你一个匿名类型的IEnumerable,但你已经知道如何把它变成正确的类型。

        var assets = from asset in xd.Descendants("asset")
                     from metaType in asset.Descendants("metadata")
                     from metaUri in asset.Descendants("metadata")
                     where metaType.Attribute("Id").Value == "ItemType"
                     && metaUri.Attribute("Id").Value == "ItemUri"
                     select new
                     {
                         ItemType = metaType.Attribute("Value").Value,
                         ItemUri = metaUri.Attribute("Value").Value
                     };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-01
          • 1970-01-01
          • 2016-06-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多