Проблема с пространством имен — все запросы XPath возвращают null

#xml #powershell #xpath

#xml #powershell #xpath

Вопрос:

У меня есть XML-документ $books , который использует пространства имен, и я попытался создать XML namespacemanager с помощью чего-то вроде $ns = New-Object System.Xml.XmlNamespaceManager($books.NameTable) . Я не совсем уверен, что я делаю неправильно после этого. Я пытаюсь использовать SelectSingleNode() для поиска в документе XML для определенных узлов, которые мне нужны, но все мои запросы XPath возвращают null.

Вот фрагмент XML-документа:

 <ernm:NewReleaseMessage xmlns:ernm="http://ddex.net/xml/ern/341" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" LanguageAndScriptCode="en" MessageSchemaVersionId="/ern/341" xs:schemaLocation="http://ddex.net/xml/ern/341 http://ddex.net/xml/ern/341/release-notification.xsd">
    <MessageHeader>
        <MessageId>123123</MessageId>
        <MessageRecipient>
            <PartyId>567567</PartyId>
                <PartyName>
                    <FullName>John Smith</FullName>
                </PartyName>
        </MessageRecipient>
    </MessageHeader>
</ernm:NewReleaseMessage>
  

Кроме того, вот немного из того, что я пробовал до сих пор, чтобы начать SelectSingleNode() работать правильно:

 [xml]$books = Get-Content xmlpath.xml
$ns = New-Object System.Xml.XmlNamespaceManager($books.NameTable)
$ns.AddNamespace("ns", $books.DocumentElement.NamespaceURI)

$books.SelectSingleNode("//newreleasemessage", $ns) #returns null
$books.SelectSingleNode("//ns:newreleasemessage", $ns) #returns null
$books.SelectSingleNode("//ernm:newreleasemessage", $ns) #returns null
$books.SelectSingleNode("//xmlns:newreleasemessage", $ns) #returns null
$books.SelectSingleNode("//xml:newreleasemessage", $ns) #returns null
  

Я также пробовал другие узлы, newreleasemessage и он по-прежнему возвращается пустым, я просто хотел привести несколько примеров того, что я пробовал. Как правильно использовать пространства имен здесь?

Ответ №1:

Запросы XPath чувствительны к регистру. Это работает:

 $books.SelectSingleNode("//ns:NewReleaseMessage", $ns)
  

Комментарии:

1. Господи, я чувствую себя глупо. Спасибо, поддержите. Почему это не указано в верхней части каждого отдельного введения xpath !?

2. Потому что это проблема только для людей, которые последние несколько лет писали на языках, не чувствительных к регистру, и они в меньшинстве.