【问题标题】:Xml node value from an attribute in VB.net来自 VB.net 中属性的 XML 节点值
【发布时间】:2013-01-22 17:09:47
【问题描述】:

我有一个类似的 XML

<Categories>
    <category name="a">
        <SubCategory>1</SubCategory>
        <SubCategoryName>name1</SubCategoryName>
    </category>
    <category name="b">
        <SubCategory>2</SubCategory>
        <SubCategoryName>name2</SubCategoryName>
    </category>
</Categories>

如何从&lt;category name="a"&gt; 获取&lt;SubCategoryName&gt; 的值?

【问题讨论】:

    标签: xml vb.net xmlnode xml-attribute


    【解决方案1】:

    简单点怎么样

    Dim xml = <Categories> 
                    <category name="a"> 
                        <SubCategory>1</SubCategory> 
                        <SubCategoryName>name1</SubCategoryName> 
                    </category> 
                    <category name="b"> 
                        <SubCategory>2</SubCategory> 
                        <SubCategoryName>name2</SubCategoryName> 
                    </category> 
                   </Categories>
    
    Dim result = xml.<category> _
                    .First(Function(e) e.Attribute("name") = "a") _
                    .<SubCategoryName>.Value
    

    result 现在是name1

    【讨论】:

      【解决方案2】:

      你可以把它当作

       Dim doc As XDocument = XDocument.Load("YourXMLFileName")
       Dim query = From d In doc.Descendants("Categories").Elements("category")
                      Where d.Attribute("name").Value = "a"
                      Select d.Element("SubCategoryName").Value
      

      【讨论】:

        【解决方案3】:

        你可以这样做:

        Dim aux As New Xml.XmlDocument()
        Dim nodeLst As Xml.XmlNodeList
        Dim sResult As String = String.Empty
        
        aux.Load(sXmlFilePath)
        nodeLst = aux.GetElementsByTagName("category")
        
        For Each cat As Xml.XmlElement In nodeLst
            If cat.GetAttribute("name") = "a" Then
                sResult = cat("SubCategoryName").Value
                Exit For
            End If
        Next
        

        【讨论】:

          【解决方案4】:

          按照 Usman 的建议,您可以使用 LINQ,但另一个流行的选择是使用 XPath。您可以使用 XPath 来选择使用 XDocument 类或较旧的 XmlDocument 类的匹配元素。

          以下是通过 XDocument 类使用 XPath 的方法:

          Dim doc As New XDocument()
          doc.Load(filePath)
          Dim name As String = doc.XPathSelectElement("/Categories/category[@name='a']/SubCategoryName").Value
          

          下面是通过 XmlDocument 类使用 XPath 的方法:

          Dim doc As New XmlDocument()
          doc.Load(filePath)
          Dim name As String = doc.SelectSingleNode("/Categories/category[@name='a']/SubCategoryName").InnerText
          

          XPath 各部分的含义如下:

          • /Categories - 开头的斜线指示它查看 XML 文档的根目录。斜线后面是我们在根中查找的子元素的名称。
          • /category - 我们在 /Categories 元素中查找的元素的名称。
          • [@name='a'] - 方括号表示它是一个条件类和 If 语句,有点像。 @ 符号表示我们正在指定一个属性名称(而不是元素名称)。
          • /SubCategoryName - 我们在 category 元素中寻找的与该条件匹配的子元素的名称。

          XPath 非常强大和灵活。 XPath 是一种标准查询语言,许多 XML 工具和技术(例如 XSLT)都在使用它,因此学习它非常有用。此外,有时,即使在文档中,能够通过简单的字符串专门引用文档中的特定 XML 节点也很方便。 LINQ 很棒,但它是一项专有的 Microsoft 技术,如果需要,您不能将 LINQ 路径作为字符串存储在数据库或配置文件中,因此有时 XPath 是一种可取的方法。

          XPath 的另一个变体是//category[@name='a']/SubCategoryName。开头的双斜杠指示它在文档中的任何位置查找类别元素,而不是在任何特定的父元素下。

          【讨论】:

            【解决方案5】:

            代码可以代替

            sResult = cat("SubCategoryName").Value

            使用

            sResult = cat("SubCategoryName").InnerText

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-02
              • 1970-01-01
              相关资源
              最近更新 更多