Разбор XML с пространством имен по умолчанию с использованием xPath в javascript - PullRequest
3 голосов
/ 20 июля 2011

Мне нужно создать парсер XML xPath. Все синтаксический анализ должен происходить на стороне клиента (с использованием JavaScript). Я создал javascript, который делает это, и все выглядит нормально, пока не вступят в игру пространства имен по умолчанию. Я просто не могу запросить XML, который имеет пространство имен по умолчанию.

Я создал пример кода на скрипке. В xmlString - строка XML, полученная с сервера. В xPathString выполняется запрос к полученному XML.

Вот несколько сценариев:

  1. http://jsfiddle.net/BF34q/1/ - без пространств имен - все работает ОК
  2. http://jsfiddle.net/BF34q/2/ - добавлено пространство имен ns. элемент имеет префикс ns: xPath использует этот префикс - ОК
  3. http://jsfiddle.net/BF34q/3/ - используется пространство имен по умолчанию - не уверен, как настроить xPathString.

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

var xPathString = "//*[local-name()='book']";

и разрешите им анализировать его, используя простые выражения xPath. Интересно, можно ли назначить префикс пространства имен по умолчанию в javascript?

Примечание. Пример, приведенный в скрипте, не будет работать в IE.

Ответы [ 2 ]

8 голосов
/ 27 июля 2011

Я думаю, что есть три способа сделать это:

  1. Использовать синтаксис //*[local-name()='book'] для доступа к узлам
  2. Преобразование XML в строку , удаление пространства имен по умолчанию с помощью RegExp, преобразование его обратно в XML
  3. Для файлов XML, для которых вы заранее знаете пространства имен, вы можете создать свой собственный преобразователь пространства имен , который позволит вам использовать собственный префикс для пространства имен по умолчанию.

Это может быть достигнуто так:

function nsResolver(prefix) {
    switch (prefix) {
        case 'xhtml':
            return 'http://www.w3.org/1999/xhtml';
        case 'mathml':
            return 'http://www.w3.org/1998/Math/MathML';
        default:
            return 'http://example.com/domain';
    }
}
xml.evaluate('//myPrefix:book', xml, nsResolver, XPathResult.ANY_TYPE, null);
0 голосов
/ 20 июля 2011

У меня сложилось впечатление, что ваше понимание обработки XPath не соответствует реализации - если, конечно, реализация, с которой вы имеете дело, сильно отличается от тех, с которыми я знаком.

Обычно процессору XPath необходимо зарегистрировать пространства имен и сопоставить префиксы, чтобы выражение могло быть успешно оценено.Таким образом, префиксы могут быть чем угодно - единственное, что имеет значение, это то, к чему они привязаны.См. этот ответ известного эксперта для получения дополнительной информации.

...