【问题标题】:Cannot get element by attribute value with XDocument无法使用 XDocument 按属性值获取元素
【发布时间】:2015-05-28 09:07:13
【问题描述】:

我有 customUIXml 类型的 XDocument 对象,它具有以下 XML 作为值:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab id="t1" label="Shalala">
        <!-- stuff -->
      </tab>
      <tab id="tab_dev" label="SomeOtherTab">
        <!-- stuff -->
      </tab>
      <tab id="t108" label="MyTab">
        <!-- stuff -->
      </tab>
    </tabs>
  </ribbon>
</customUI>

我想获得标签值为“MyTab”的tab 节点。这是我使用的代码:

Dim xtab As XElement = Nothing
Dim nodes = From nodeToTake In customUIXml.Descendants().Elements("tab") _
            Where nodeToTake.Attribute("label").Value = "MyTab"
            Select nodeToTake

For Each tab As XElement In nodes
    xtab = tab
Next

但我没有得到任何结果,而且我似乎找不到我做错了什么......

【问题讨论】:

    标签: vb.net linq-to-xml


    【解决方案1】:

    您可以简单地使用 XML 文字,因此您的代码将很简单:

    Dim xtab = customUIXml.<ribbon>.<tabs>.<tab>.First(Function(tab) tab.@label = "MyTab")
    

    此外,您的代码似乎可以正常工作,因此您的问题似乎出在其他地方。

    Dim customUIXml = <customUI>
    <ribbon>
        <tabs>
        <tab id="t1" label="Shalala">
            <!-- stuff -->
        </tab>
        <tab id="tab_dev" label="SomeOtherTab">
            <!-- stuff -->
        </tab>
        <tab id="t108" label="MyTab">
            <!-- stuff -->
        </tab>
        </tabs>
    </ribbon>
    </customUI>
    
    Dim xtab As XElement = Nothing
    Dim nodes = From nodeToTake In customUIXml.Descendants().Elements("tab") _
                Where nodeToTake.Attribute("label").Value = "MyTab"
                Select nodeToTake
    
    For Each tab As XElement In nodes
        xtab = tab
    Next
    
    Console.WriteLine(xtab)
    

    展示

    <tab id="t108" label="MyTab">
      <!-- stuff -->
    </tab>
    

    很好。


    如果您的实际 XML 包含命名空间,则必须考虑到这一点:

    ...
    Dim df As XNamespace = customUIXml.Name.Namespace
    
    Dim xtab As XElement = Nothing
    Dim nodes = From nodeToTake In customUIXml.Descendants().Elements(df + "tab") _
                ...
    

    【讨论】:

    • 使用文字给了我异常Sequence contains no matching element...我检查了XML并且节点在那里....另外,您认为使用linq-to-xml的问题可能是与命名空间相关联?
    • @Syspect 如果您的 XML 有命名空间,则必须考虑到这一点。正如我的回答所示,您在问题中发布的 xml 与您的代码配合得很好。因此,如果您的实际 XML 不同(例如使用命名空间),您应该更新您的问题以包含它。
    • @Syspect 查看我关于如何将命名空间包含到查询中的更新
    • 我在帖子中更新了 XML。但是尝试做Dim df As XNamespace = customUIXml.Name.NamespaceName 不是System.Xml.Linq.XDocument 的成员,所以我不能分配命名空间。
    • @Syspect 在我的回答中,我使用了您问题的 XML,即XElement。在您的真实代码中,您似乎使用了XDocument,因此您必须使用Dim df As XNamespace = customUIXml.Root.Name.Namespace 而不是Dim df As XNamespace = customUIXml.Name.Namespace
    【解决方案2】:
    string xml = "<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui' onLoad='Ribbon_Load'><ribbon><tabs><tab id='t1' label='Shalala'><!-- stuff --></tab><tab id='tab_dev' label='SomeOtherTab'><!-- stuff --></tab><tab id='t108' label='MyTab'><!-- stuff --></tab></tabs></ribbon></customUI>";
    
    var xelement = XElement.Parse(xml);
    var list = xelement.Descendants().Where(x => x.Name.LocalName == "tab" && x.Attribute("label") != null).ToList();
    list.ForEach(x => Console.WriteLine(x.Attribute("label").Value));
    

    您可以访问 localName 来检查元素标签值, 使用 LinqPad 进行检查,它可以正常工作,希望对您有所帮助..

    :)

    编辑:来自 Telerik 的 Vb 代码转换:

    Dim xml As String = "<customUI xmlns='http://schemas.microsoft.com/office/2009/07/customui' onLoad='Ribbon_Load'><ribbon><tabs><tab id='t1' label='Shalala'><!-- stuff --></tab><tab id='tab_dev' label='SomeOtherTab'><!-- stuff --></tab><tab id='t108' label='MyTab'><!-- stuff --></tab></tabs></ribbon></customUI>"
    
    Dim xelement__1 = XElement.Parse(xml)
    Dim list = xelement__1.Descendants().Where(Function(x) x.Name.LocalName = "tab" AndAlso x.Attribute("label") IsNot Nothing).ToList()
    list.ForEach(Function(x) Console.WriteLine(x.Attribute("label").Value))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多