Зачем нужен XmlNamespaceManager при разборе XML - PullRequest
3 голосов
/ 24 марта 2011

Поэтому, когда я получал нулевое значение с помощью selectSingleNode, я обнаружил, что мне нужно объявить пространство имен, потому что я использовал атрибут xmlns.У меня вопрос, почему мне нужно использовать префикс при разборе xml, если я не использую префикс в самом файле xml?

Причина, по которой у меня есть атрибут xmlns, заключается в том, что принимающая сторонаТребуется вывод XML.Я предпочел бы прочитать его из базового XML, чем жестко закодировать в программе.

Это код, который работает

xmlns = New XmlNamespaceManager(xmlTemplate.NameTable)
xmlns.AddNamespace("dc", ns)

Я пытался сделать это - не работает

xmlns = New XmlNamespaceManager(xmlTemplate.NameTable)
xmlns.AddNamespace(String.Empty, ns)

Короче, есть ли способ избавиться от префикса "dc"?

Ответы [ 2 ]

4 голосов
/ 24 марта 2011

Это просто одна из тех вещей, "которые они так построили".Согласно MSDN (запросы XPath с префиксами, сопоставленными с именами) :

XmlNamespaceManager позволяет добавлять пространства имен по умолчанию, используя пустую строку в качестве префикса.Однако XPath рассматривает пустой префикс как пустое пространство имен.Другими словами, только префиксы, сопоставленные с пространствами имен, могут использоваться в запросах XPath.Если вы хотите использовать пространство имен по умолчанию из документа XML в выражении XPath, вам необходимо определить префикс для него.

А также из MSDN (XmlNamespaceManager.AddNamespace) :

Если XmlNamespaceManager будет использоваться для разрешения пространств имен в выражении XML Path Language (XPath), необходимо указать префикс.Если выражение XPath не включает префикс, предполагается, что пространство имен Унифицированный идентификатор ресурса (URI) является пустым пространством имен

РЕДАКТИРОВАТЬ

И IЯ предполагаю, что ваш код выглядит примерно так:

Dim S = "<xml xmlns=""http://www.exmaple.com/""><node/></xml>"

Dim X As New Xml.XmlDocument()

X.LoadXml(S)
Dim NS As New Xml.XmlNamespaceManager(X.NameTable)
NS.AddNamespace("dc", "http://www.exmaple.com/")

''//Will not work
Dim N1 = X.SelectSingleNode("//xml/node", NS)
If N1 Is Nothing Then
    Trace.WriteLine("Node not found")
Else
    Trace.WriteLine("Node found")
End If

''//Works
Dim N2 = X.SelectSingleNode("//dc:xml/dc:node", NS)
If N2 Is Nothing Then
    Trace.WriteLine("Node not found")
Else
    Trace.WriteLine("Node found")
End If
2 голосов
/ 24 февраля 2012

Вы должны иметь возможность получить пространство имен из входящего XML вместо того, чтобы жестко его кодировать, выполнив:

NS.AddNamespace("dc",X.DocumentElement.Attributes("xmlns").InnerText)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...