【问题标题】:How to select the tag based on tag name and get its count如何根据标签名称选择标签并获取其计数
【发布时间】:2012-07-04 18:01:47
【问题描述】:

无法选择带有标签名称的节点。

小 XML:

<author-group id="a001">
<author id="aa001">
  <given-name id="g001">Name</given-name>
  <surname id="s001">Name</surname>
</author>
<author id="aa002">
 <given-name id="g002">Name</given-name>
 <surname id="s002">Name</surname>
</author>
<author id="aa003">
   <given-name id="g003">Name</given-name>
   <surname id="s003">Name</surname>
</author>
</author-group>

代码尝试:

Dim xDom As New Xml.XmlDocument
xDom .LoadXml(XMLStr)
Dim Lst As XmlNodeList = xDom.SelectNodes("//author")
Dim NodeCount as Integer =Lst.Count()

计数为零..

【问题讨论】:

  • 这是整个 XML 文档,还是只是一个摘录?我想知道文档是否定义了xmlns 属性的任何命名空间。
  • 不,这不是整个 XML 文档。是的,它在其他元素中有一些命名空间

标签: vb.net xpath xmldocument


【解决方案1】:

我将您的代码复制到一个新项目中,它可以正常工作。这是我的测试项目中的代码:

Dim XMLStr As String = "<author-group id=""a001""><author id=""aa001"">  <given-name id=""g001"">Name</given-name>  <surname id=""s001"">Name</surname></author><author id=""aa002""> <given-name id=""g002"">Name</given-name> <surname id=""s002"">Name</surname></author><author id=""aa003"">   <given-name id=""g003"">Name</given-name>   <surname id=""s003"">Name</surname></author></author-group>"
Dim xDom As New Xml.XmlDocument
xDom.LoadXml(XMLStr)
Dim Lst As XmlNodeList = xDom.SelectNodes("//author")
Dim Cnt As Integer = Lst.Count()

所以,你的错误一定在代码的其他地方。

【讨论】:

    【解决方案2】:

    试试这个(添加 xml DTD,并使用 XDocument):

    Dim x As XDocument = <?xml version="1.0" encoding="utf-8"?>
                                 <author-group id="a001">
                                     <author id="aa001">
                                         <given-name id="g001">Name</given-name>
                                         <surname id="s001">Name</surname>
                                     </author>
                                     <author id="aa002">
                                         <given-name id="g002">Name</given-name>
                                         <surname id="s002">Name</surname>
                                     </author>
                                     <author id="aa003">
                                         <given-name id="g003">Name</given-name>
                                         <surname id="s003">Name</surname>
                                     </author>
                                 </author-group>
    
    Dim xDom As New XmlDocument
    xDom.LoadXml(x.ToString())
    Dim Lst As XmlNodeList = xDom.SelectNodes("//author")
    Dim Cnt As Integer = Lst.Count()
    

    【讨论】:

      【解决方案3】:

      xmlns 属性定义了所谓的默认命名空间,该命名空间适用于该元素所在元素下的所有内容。但是,您的 XPath 没有指定任何命名空间,这意味着它只会找到不在任何命名空间中的 author 元素。因此,您实际上是在寻找错误的元素名称。

      使用命名空间的 XPath 查询需要 XmlNamespaceManager,它提供命名空间前缀到命名空间的映射。也可以按以下相同的方式在 XPath 中使用默认命名空间。

      在下面的 sn-p 中用默认命名空间 URI 替换 xxx,并在将 xDom 与您的文档一起加载后执行此操作:

      'Create an XmlNamespaceManager for resolving namespaces.
      Dim nsmgr as XmlNamespaceManager = new XmlNamespaceManager(xDom.NameTable)
      nsmgr.AddNamespace(String.Empty, "xxx")
      
      Dim nodeList as XmlNodeList 
      Dim root as XmlElement = xDom.DocumentElement
      nodeList = root.SelectNodes("//author", nsmgr)
      

      【讨论】:

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