Парсер Javascript xml: как получить узлы, которые имеют ":" в имени - PullRequest
2 голосов
/ 26 ноября 2010

У меня есть следующий код, где я пытаюсь получить узлы c: CreationDate:

 value = '<?xml version="1.0" encoding="UTF-8"?><content><c:CreationDate>2010-09-04T05:04:53Z</c:CreationDate></content>';

 xml = (new DOMParser()).parseFromString(value, 'text/xml');

 console.log(xml.getElementsByTagName('c:CreationDate'));

К сожалению, он возвращает пустой массив, а не массив с узлом, который находится в xml.Я думаю, что это вызвано из-за символа ":".

Есть ли способ избежать этого?

Примечание: Пожалуйста, не предлагайте использовать на дочерних узлах или подобных вещах.Это не будет работать для меня, так как мой xml является сложным (здесь только пример) и, скорее всего, изменится в будущем, и я могу полагаться только на имя тега.

Спасибо!

1 Ответ

11 голосов
/ 27 ноября 2010

c в c:CreationDate обозначает префикс пространства имен XML .Префикс пространства имен является только ярлыком для пространства имен.Пространство имен должно быть определено где-то в документе с атрибутом xmlns:c.Но в вашем документе определение пространства имен отсутствует.

Таким образом, оно должно выглядеть следующим образом:

var value = '<?xml version="1.0" encoding="UTF-8"?>' +
            '<content>' +
            '  <c:CreationDate xmlns:c="http://my.namespace">2010-09-04T05:04:53Z</c:CreationDate>' +
            '</content>';

или

var value = '<?xml version="1.0" encoding="UTF-8"?>' +
            '<content xmlns:c="http://my.namespace">' +
            '  <c:CreationDate>2010-09-04T05:04:53Z</c:CreationDate>' +
            '</content>';

В этом примере префикс c назначен пространству имен http://my.namespace.К тегу CreationDate добавляется префикс c, поэтому он принадлежит пространству имен http://my.namespace.

Затем вы можете использовать функцию getElementsByTagNameNS() с поддержкой пространства имен для запроса элемента CreationDate:

console.log(xml.getElementsByTagNameNS('http://my.namespace', 'CreationDate'));

В качестве первого параметра вы должны передать реальное имя пространства имен, а не префикс.

...