2011-11-03 30 views
0

我有一个XPath表达式,应该返回/从XML文档中只获取一个节点。但它不仅仅是一个。我不明白为什么。为什么这个XPath表达式获得太多数据?

代码隐藏:

Dim xmlNameTbl As XmlNameTable = rootDoc.NameTable 
Dim xmlNS As XmlNamespaceManager = New XmlNamespaceManager(xmlNameTbl) 
xmlNS.AddNamespace("asp", "http://test.com/asp") 

Dim sectionPosition As String = rowNode.GetAttribute("ID") 
'In this example sectionPosition is "A03" 

Dim sectionLetter As String = rowNode.GetAttribute("ID").Substring(0, 1) 
Dim sectionRowNumberText As String = rowNode.GetAttribute("ID").Remove(0, 1) 
Dim sectionRowNumber As Integer 
Integer.TryParse(sectionRowNumberText, sectionRowNumber) 

Dim addingNav As XPathNavigator = rootDoc.CreateNavigator 

Dim hello = rootDoc.ChildNodes 

Dim addingItr As XPathNodeIterator = addingNav.Select("//asp:TableRow[@ID='" & sectionPosition & "']", xmlNS) 
'Nodes with A03 and A02 are being returned, even though it should be only A03 returned 

XML文档:

<?xml version="1.0" encoding="utf-8"?> 
<Root xmlns:asp="http://test.com/asp" xmlns:meta="http://test.com/meta" xmlns:cc1="http://test.com/cc1"> 
    <asp:TableRow ID="A03"> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlNumberRes" meta:resourcekey="tagthreeCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlDescRes" meta:resourcekey="tagthreeCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagthreeCtrlNoteRes" meta:resourcekey="tagthreeCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:RadioButtonList ID="rblthreeCtrlRes0" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res0" Value="1" /> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res0" Value="0" /> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res0" Value="2" /> 
     </asp:RadioButtonList> 
     <asp:RadioButtonList ID="rblthreeCtrlRes1" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res1" Value="1" /> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res1" Value="0" /> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res1" Value="2" /> 
     </asp:RadioButtonList> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdthreeCtrlRes" meta:resourcekey="cmdthreeCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmthreeCtrlRes" meta:resourcekey="lblAssmthreeCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblQualthreeCtrlRes" meta:resourcekey="lblQualthreeCtrlRes" runat="server" /> 
     <asp:Button ID="cmdQualAcceptthreeCtrlRes" meta:resourcekey="cmdQualAcceptthreeCtrlRes" OnClick="cmdQualAccept_Click" runat="server" Text="Accept" Visible="True" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
    <asp:TableRow ID="A04"> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlNumberRes" meta:resourcekey="tagoneCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlDescRes" meta:resourcekey="tagoneCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagoneCtrlNoteRes" meta:resourcekey="tagoneCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxtoneCtrlRes0" meta:resourcekey="tagtxtoneCtrlRes0" runat="server" /> 
     <asp:Textbox ID="txtoneCtrlRes0" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdoneCtrlRes" meta:resourcekey="cmdoneCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmoneCtrlRes" meta:resourcekey="lblAssmoneCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
    <asp:TableRow ID="A02"> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlNumberRes" meta:resourcekey="tagtwoCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlDescRes" meta:resourcekey="tagtwoCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagtwoCtrlNoteRes" meta:resourcekey="tagtwoCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxttwoCtrlRes0" meta:resourcekey="tagtxttwoCtrlRes0" runat="server" /> 
     <asp:Textbox ID="txttwoCtrlRes0" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdtwoCtrlRes" meta:resourcekey="cmdtwoCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmtwoCtrlRes" meta:resourcekey="lblAssmtwoCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
</Root> 

回答

1

我找不到任何错误与上面的代码/ XML。

运行你的例子正常工作,与addingItr.Count返回1.

我一倍迭代像这样返回的节点选中此:

For Each n As XPathNavigator In addingItr 
    Dim nodeName As String = n.Name 
Next 

正在运行什么代码,以确定的计数返回的节点?

编辑

来自:XPathNodeIterator Class

通过XPathNavigator类返回创建XPathNodeIterator对象是 不位于选定的一组节点的第一个节点上。对 调用XPathNodeIterator类的MoveNext方法时,必须将 定位到 所选节点集中的第一个节点上的XPathNodeIterator对象。

因此,您在调试时看到的是根节点的InnerXml属性。

+0

在调试过程中,我将鼠标悬停在addsItr变量上并遍历属性。我看到这个属性是“InnerXML”。 – dotnetN00b

+0

似乎你是对的。我想我太早检查了迭代器。本应该等到MoveNext。谢谢,jdavies。 – dotnetN00b

相关问题