Измените префикс пространства имен элементов XML с помощью Microsoft.xmldom, чтобы использовать GetElementsByTagName.

При использовании XML-объекта я должен предвидеть, что используемые префиксы пространств имен время от времени будут отличаться (3P печально известен этим, иногда даже не включая префикс в каждый элемент и позволяя ему подразумеваться его родителем). Я понимаю, как обойти это в .NET, но этот проект требует от меня использования объектов VFP и Microsoft.xmldom.

Проблема в том, что когда я использую GetElementsByTagName, я не нахожу элемент, если префикс не используется или если он был изменен:

<ExampleTag>Example</ExampleTag>

loNode = loRoot.getElementsByTagName("ns2:ExampleTag").Item(0)

И наоборот:

<ns2:ExampleTag>Example</ns2:ExampleTag>

loNode = loRoot.getElementsByTagName("ExampleTag").Item(0)

Я продолжаю читать о getElementsByTagNameNS, но он всегда ошибается, заявляя, что он не оценивается как объект.

Если я знаю, что URI пространства имен всегда будет одним и тем же, могу ли я не использовать это в своих интересах и каким-то образом игнорировать/изменить текущие префиксы пространства имен, используемые в объекте XML?


person MattCash    schedule 14.12.2015    source источник


Ответы (1)


Вы правы, если URI пространства имен всегда будет одним и тем же, то фактические префиксы просто пустяки. Ключ должен установить свойство SelectionNamespaces.

oDoc = createobject("MSXML2.DOMDocument.6.0")
oDoc.setProperty("SelectionNamespaces", [xmlns:foo="] + m.cNamespaceURI + ["])
oDoc.LoadXML(...)

with oDoc.selectNodes("//foo:ExampleTag")
   ...
endwith

Таким образом, вы можете выбирать узлы на основе выбранного вами префикса (здесь foo) независимо от фактических префиксов, если таковые имеются, которые используются вашим вводом XML.

person DarthGizka    schedule 15.12.2015
comment
Спасибо, это был билет! Я пробовал метод .setproperty, но все еще использовал .GetElementsByTagName. Как только я переключился на использование .selectNodes, он работает как шарм. - person MattCash; 15.12.2015