Selectnodes在vb.net中不起作用

时间:2012-07-04 08:50:08

标签: vb.net xpath xmldocument

Hai我有像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>

我想要作者的节点列表,所以我使用了以下代码将xml字符串加载到DOM。

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

这里Cnt值为零我不知道为什么它不起作用。我正在使用UTF-8编码的xml文件。

3 个答案:

答案 0 :(得分:4)

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

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

在以下代码段中替换xxx的默认命名空间URI,并在将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)

答案 1 :(得分:0)

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

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 :(得分:0)

试试这个(添加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()