как проверить, существует ли элемент XML или нет?

Я хотел бы отсканировать свой xml-файл, существует ли конкретный узел или нет, это мои коды.

 Dim xmlDoc As New XmlDocument()
        xmlDoc.Load("C:\Users\Desktop\XMLFILE.xml")

        Dim rootName As String = xmlDoc.DocumentElement.Name
        Dim nodes As XmlNode
        'Dim objTest As XmlElement

        Try
            nodes = xmlDoc.DocumentElement.SelectSingleNode(rootName & "\\PRODUCT\\NAME")
            MessageBox.Show("Exists")
        Catch ex As Exception
            MessageBox.Show("Not exists")
        End Try

Результаты показывают «Не существует». После того, как я закомментирую свою попытку, поймать и завершить попытку, результаты ошибки показывают:

An unhandled exception of type 'System.Xml.XPath.XPathException' occurred in System.Xml.dll

Additional information: 'RootName\\PRODUCT\\NAME' has an invalid token.

Что это значит?


person lara    schedule 29.08.2019    source источник
comment
1) Где код с надписью Failed в нем? 2) nodes должно быть Nothing, если узел не найден - для этого не должно возникать исключение.   -  person Andrew Morton    schedule 29.08.2019
comment
Вы пытались заменить двойную обратную косую черту одинарной косой чертой?   -  person ajakblackgoat    schedule 29.08.2019
comment
@AndrewMorton, извините, это должно было быть «Не существует», а не «Не удалось». Я уже редактировал эту часть. В моем случае он возвращает «Не существует» каждый раз, когда запускается код, что заставляет меня задуматься, неправильный ли мой код для «Существует»..   -  person lara    schedule 29.08.2019
comment
Я пробовал это, все равно выскакивало сообщение Not Exists. @ajakblackgoat   -  person lara    schedule 29.08.2019
comment
Я попробовал это и проверил мои последние отредактированные вопросы. @ЭндрюМортон   -  person lara    schedule 29.08.2019
comment
@lara Вы можете использовать такую ​​утилиту, как генератор Xpath, чтобы получить нужный вам xpath или, по крайней мере, очень хорошая отправная точка.   -  person Andrew Morton    schedule 29.08.2019
comment
Я попробовал предложение ajakblackgoat, используя одинарную косую черту, и это работает. Отображаемые сообщения об успешном выполнении. @AndrewMorton, но теперь, когда я удалил тег «ПРОДУКТ», сообщение «не существует» не отображается. вместо этого он говорит, что XmlException не было обработано.   -  person lara    schedule 29.08.2019
comment
@lara Возникает ли исключение в строке с SelectSingleNode или где-то еще? Я спрашиваю, потому что документация для Метод XmlNode.SelectSingleNode говорит, что он возвращает Nothing (null), если узел не найден.   -  person Andrew Morton    schedule 29.08.2019


Ответы (1)


  1. Во-первых, путь неверный. / — это разделитель пути для пути xml, а не \\.
  2. Вы не должны указывать rootName в пути xml, так как вы уже вызываете функцию SelectSingleNode для корневого узла (xmlDoc.DocumentElement)
  3. То, как вы определяете несуществующий узел, неверно. SelectSingleNode не генерирует исключение, если путь не существует. Вместо этого он просто возвращает Nothing.

Исходя из вышеизложенного, вот измененный код:

Dim xmlDoc As New XmlDocument()
xmlDoc.Load("C:\Users\Desktop\XMLFILE.xml")

Dim nodes As XmlNode

Try
    nodes = xmlDoc.DocumentElement.SelectSingleNode("PRODUCT/NAME")

    If nodes Is Nothing Then
        MessageBox.Show("Not exists")
    Else
        MessageBox.Show("Exists")
    End If

Catch ex As Exception
    MessageBox.Show(ex.Message)

End Try

Чтобы использовать SelectSingleNode из корня, используйте следующий путь:

xmlDoc.SelectSingleNode("descendant::PRODUCT/NAME")
person ajakblackgoat    schedule 29.08.2019
comment
Он работает отлично! могу ли я узнать, почему я не могу использовать `Dim rootName As String = xmlDoc.DocumentElement.Name`? Я новичок в этом, поэтому я немного размыт в этой теме. В чем разница между SelectSingleNode и SelectNode? - person lara; 30.08.2019
comment
@lara относительно вашего первого вопроса, пожалуйста, обратитесь к пункту 2 в моем ответе выше. Для второго вопроса обратитесь к документации: SelectSingleNode и SelectNodes - person ajakblackgoat; 30.08.2019
comment
там написано SelectNodes Выбирает список узлов. и SelectSingleNode выбирает первый из элементов. какая разница между этими двумя? Я все еще в замешательстве @ajakblackgoat - person lara; 30.08.2019
comment
Я знаю, что это старо, но для всех, кто ищет: SelectNodes во множественном числе и выбирает все найденные узлы, соответствующие вашим критериям. (Список узлов). SelectSingleNode является единственным и выберет только первый найденный файл, соответствующий вашим критериям. насколько мне известно - person DDuffy; 16.04.2021