如何使用XPATH获取特定节点的父节点?

时间:2011-12-29 17:12:30

标签: xpath c#-2.0

我有以下xml文件,我需要使用xpath来获取基于“linenumber”的“amount”值。

    <Doc>
      <Documents>
        <Document1>
          <linenumber>800</linenumber>
          <amount>100.00</amount>
          <name>fee1</name>
        </Document1>
        <Document2>
          <linenumber>801</linenumber>
          <amount>200.00</amount>
          <name>fee2</name>
        </Document2>
        <Document3>
          <linenumber>802</linenumber>
          <amount>300.00</amount>
          <name>fee3</name>
        </Document3>
        <Document4>
          <linenumber>803</linenumber>
          <amount>400.00</amount>
          <name>fee4</name>
        </Document4>
      </Documents>
    </Doc>

我尝试了下面函数'GetDocumentField'中指定的xpath,但函数调用GetDocumentField(801,“amount”)没有返回任何值。我不能使用LINQ,因为它基于.Net framework 2.0。任何人都可以建议如何编写此xpath查询?谢谢!

    Private Function GetDocumentField(ByVal line As Integer, ByVal field As String) As String
         Return GetValueFromXPath(String.Format("//linenumber[.='{0}']/parent::node()/{1}", line, field)))
    End Function

    Private Function GetValueFromXPath(ByVal xpath As String) As String
        Dim node As XmlNode

        node = InputXml.SelectSingleNode(xpath)

        Return GetValueFromNode(node)
    End Function

    Private Function GetValueFromNode(ByVal node As XmlNode) As String
        If node Is Nothing Then
            Return String.Empty
        End If

        If node.InnerText Is Nothing Then
            Return String.Empty
        End If

        Return node.InnerText
    End Function

1 个答案:

答案 0 :(得分:1)

使用此XPath表达式

/*/*/*[linenumber = '801']/amount

但在此之前,请更正所提供的非格式良好的XML文档(您可能没有注意到加载InputXml时存在解析异常)。更具体地说,所有amount元素都没有结束标记。