Ссылка на необъявленный префикс пространства имен при разборе MSXML - PullRequest
16 голосов
/ 10 мая 2011

Как мне решить

Reference to undeclared namespace prefix: '%s'

проблема с реализацией msxml от Microsoft?


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

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://purl.org/rss/1.0/"
    xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3c.org/1999/02/22-rdf-syntax-ns#rdf.xsd">
    <item rdf:about="http://www.bankofcanada.ca/stats/rates_rss/STATIC_IEXE0101.xml">
        <cb:statistics>
            <cb:exchangeRate>
                <cb:value decimals="4">1.0351</cb:value>
                <cb:baseCurrency>CAD</cb:baseCurrency>
                <cb:targetCurrency>USD</cb:targetCurrency>
                <cb:rateType>Bank of Canada noon rate</cb:rateType>
                <cb:observationPeriod frequency="daily">2011-05-09T12:15:00-04:00</cb:observationPeriod>
            </cb:exchangeRate>
        </cb:statistics>
    </item>
</rdf:RDF>

Выполнение запроса XPath:

/rdf:RDF/item/cb:statistics/cb:exchangeRate/cb:targetCurrency

завершается с ошибкой:

Reference to undeclared namespace prefix: 'rdf'

Редактировать

Если я отредактирую исходный XML-файл, чтобы удалить все использование пространств имен:

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf>
    <item>
        <statistics>
            <exchangeRate>
                <value decimals="4">1.0351</value>
                <baseCurrency>CAD</baseCurrency>
                <targetCurrency>USD</targetCurrency>
                <rateType>Bank of Canada noon rate</rateType>
                <observationPeriod frequency="daily">2011-05-09T12:15:00-04:00</observationPeriod>
            </exchangeRate>
        </statistics>
    </item>
</rdf>

Запрос /rdf/item/statistics/exchangeRate/baseCurrency не завершается с ошибкой и возвращает узлы:

<baseCurrency>CAD</baseCurrency>

Как мне заставить Microsoft XML работать с пространствами имен?


Редактировать 2

Я пытался добавить SelectionNamespaces к объекту DOMDocument:

doc.setProperty('SelectionNamespaces', 'xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"');

Теперь запрос xpath не завершается ошибкой, но он также не возвращает узлов:

nodes = doc.selectNodes('/rdf:RDF/item/cb:statistics/cb:exchangeRate/cb:targetCurrency');

Смотри также

Ответы [ 3 ]

22 голосов
/ 11 мая 2011

Использование SelectionNamespaces - правильный подход, вам просто не хватает пространства имен.

Обратите внимание, что ваш XML-документ явно устанавливает пространство имен по умолчанию следующим образом:

xmlns="http://purl.org/rss/1.0/"

Это означает, что любой элемент без префикса, например, элемент item, фактически находится в пространстве имен по умолчанию. Поэтому, если вы хотите выбрать этот элемент с помощью выражения XPath, вы должны сначала установить соответствующее пространство имен выбора.

Для этого вы можете изменить свой звонок на setProperty, например, так:

doc.setProperty('SelectionNamespaces', 'xmlns:rss="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"');

Здесь вы присвоили пространству имен по умолчанию из документа префикс rss: в выражении XPath. После этого изменения следующее выражение XPath должно работать правильно:

nodes = doc.selectNodes('/rdf:RDF/rss:item/cb:statistics/cb:exchangeRate/cb:targetCurrency');

Это работает, потому что оно ссылается на элемент item, используя правильное пространство имен. Тот факт, что префикс отличается между выражением XPath и исходным документом, не имеет значения. Это пространство имен, к которому привязан префикс, имеет значение.

1 голос
/ 08 июня 2015

Если вы используете XMLSerializer и видите эту ошибку, вероятно, вы столкнулись с ошибкой IE, описанной здесь:

https://stackoverflow.com/a/11399681

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

1 голос
/ 20 ноября 2014
doc.setProperty('SelectionNamespaces', 'xmlns:rss="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"');

Не забудьте загрузить файл или схему xsd в объект xmldoc

- это путь

У меня недостаточно репутации, чтобы комментировать.Но этот бит сэкономил мне много времени.

Большое вам спасибо

...