Как получить родительский узел определенного узла, используя XPATH? - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть приведенный ниже xml-файл, и мне нужно использовать xpath, чтобы получить значение «количество» на основе «белья».

    <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>

Я попробовал xpath, указанный в приведенной ниже функции 'GetDocumentField', но вызов функции 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 Ответ

1 голос
/ 29 декабря 2011

Используйте это выражение XPath :

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

Но перед этим исправьте представленный некорректный XML-документ (вы, вероятно, не заметиличто при загрузке InputXml) произошло исключение при разборе.Более конкретно, все элементы amount не имеют закрывающего тега.

...