SelectSingleNode什么都不返回

时间:2010-08-18 23:29:08

标签: xml xpath

我正在测试SelectSingleNode函数以从Visual Studio中的XMLNode对象获取单个节点,如下所示:

        Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable)
        nsmgr.AddNamespace(ndListItems.Prefix, ndListItems.NamespaceURI)
        Dim dummy As XmlNode = ndListItems.SelectSingleNode("/listitems", nsmgr)

此时,我只是尝试获取根节点,并且我使用前缀和namespaceURI属性添加到XmlNamespaceManager。问题是当我运行调试器时,没有分配虚拟变量,即它是Nothing。需要注意的是,当我分析Prefix和namespace属性的值时,它们如下所示,Prefix =“”和NamespaceURI =“http://schemas.microsoft.com/sharepoint/soap”

更新:

尝试更改代码,但我的虚拟XMLNode仍未设置

Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable)
        nsmgr.AddNamespace(ndListItems.Prefix, ndListItems.NamespaceURI)
        Dim dummy As XmlNode = ndListItems.SelectSingleNode("/" + ndListItems.Prefix + "listitems", nsmgr)

以下是我想要获取的XML代码片段,我的最终目标是访问z:row node的属性

<listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<rs:data ItemCount="1">
   <z:row ows_Title="Newhire" ows_FirstName="Rick" ows_WorkPhone="954" ows_HomePhone="954" ows_Email="genny.maxwell@email.com" ows_UserID="Rick.Newhire" ows_MetaInfo="9;#" ows__ModerationStatus="0" ows__Level="1" ows_ID="9" ows_owshiddenversion="1" ows_UniqueId="9;#{0F6251A9-D3B8-4B07-A5F8-23BAF5F2237E}" ows_FSObjType="9;#0" ows_Created="2010-08-18 15:56:40" ows_FileRef="9;#Lists/NewHires/9_.000" />
</rs:data>
</listitems>

2 个答案:

答案 0 :(得分:0)

您显然在向名称空间管理器添加名称空间时遇到了问题。

此外,您的XPath表达式最多只会选择top元素,但是您需要z:row

避免名称空间处理的一种简单且不太优雅的方法如下

使用

SelectSingleNode("/*/*/*")

SelectSingleNode("/*/*[local-name()='data']/*[local-name()='row']")

答案 1 :(得分:0)

在您的输入示例中,z:row元素的QName元组是(“#RowsetSchema”,“row”,“z”)。意味着z前缀的名称空间URI为#RowsetSchema

如果我的C#代码没有出错,则此ndListItems.Prefix评估为listitems元素的前缀为“无”或“”。所以,当你说"/" + ndListItems.Prefix + "listitems"时,它会被评估为“/ listitems”,它将被解释为没有名称空间的listitems

所以,我认为你需要:

Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable) 
nsmgr.AddNamespace("soap", "http://schemas.microsoft.com/sharepoint/soap/")
nsmgr.AddNamespace("rs", "urn:schemas-microsoft-com:rowset")
nsmgr.AddNamespace("z", "#RowsetSchema")
Dim dummy As XmlNode = ndListItems.SelectSingleNode("/soap:listitems/rs:data/z:row", nsmgr)

编辑:在我发布之后发现了我。