【问题标题】:XML to Linq getting child nodes with attribute valueXML to Linq 获取具有属性值的子节点
【发布时间】:2014-01-20 15:12:43
【问题描述】:

已经问过这个问题的变体,但我还没有找到可以帮助我解决我遇到的问题的问题。

此格式的给定和 XML 文件:

<TopLevel>
    <SecondLevel Name="Name" Color="Blue">
         <ChildNode1></ChildNode1>
         <ChildNode2></ChildNode2>
    </SecondLevel>
    <SecondLevel Name="Name2" Color="Red">
         ...
    </SecondLevel>
</topLevel>

我有属性颜色的值。 我想要的是能够先找到那个颜色对应的Name,然后再找到所有的子节点。

我更喜欢使用 Xelement 而不是 XDocument。

这是我迄今为止尝试过的,但没有运气。

XElement xelement = XElement.Load("XmlFile.xml");
IEnumerable<XElement> Name2=
           from el in xelement.Elements("SecondLevel")
           where el.Attribute("Color") == "Red"
           select el;

有了这个结果,我最终希望将其格式化为数据表。这可行吗?

【问题讨论】:

    标签: c# xml linq datatable


    【解决方案1】:

    您只是缺少将属性转换为字符串(或直接获取它的值 - 请参阅最后的注释)。您也可以选择 Name 属性值来获得字符串序列而不是 XElements:

    XElement xelement = XElement.Load("XmlFile.xml");
    IEnumerable<string> names =
               from el in xelement.Elements("SecondLevel")
               where (string)el.Attribute("Color") == "Red" // here
               select (string)el.Attribute("Name");
    

    注意:您也可以使用el.Attribute("Color").Value 直接访问属性值,但如果元素没有Color 属性,则会引发异常。因此强制转换更安全,但如果您希望代码在 xml 无效时快速失败,则可以选择访问值。

    顺便说一句,您还可以使用 XPath 来获取具有所需颜色的二级元素:

    IEnumerable<XElement> secondLevels = 
          xelement.XPathSelectElements("SecondLevel[@Color='Red']");
    

    【讨论】:

    • 这很好,因为它找到了与颜色关联的 Name 属性,但是如果我想要 SecondLevelnode 的子节点呢?
    • @moalaz 然后将您的代码保持原样 - select el 而不投影到 Name 属性值。因此,您将拥有一系列 XElements
    • 完美!有谁知道将子节点放入数据表的简单方法?
    • @moalaz 你可以选择它们的值并使用custom CopyToDataTable method创建DataTable
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多