Парсинг XML с namespaces

Всегда при необходимости прасинга XML меня немного раздражала необходимость возиться с неймспейсами и тут наконец-то до меня дошло простейшее решение.

Например у нас есть такой XML

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">
  <url>
    <loc>
      http://www.bloomberg.com/politics/articles/2015-02-11/
    </loc>
  </url>
</urlset>

Это очень упрощенный пример выдранный из sitemap сайта bloomberg, но даже его распарсить не так просто.

XML документы принято парсить с помощью XPath, работать с которым умеет, наверное, любая библиотека. Самый простой способ проверять ваши XPath-выражения — это открыть нужный файл в Chrome, открыть консоль (F12) и вбить там $x(<Ваше XPath выражение>)

Очевидный вариант с XPath $x('//url') не работает и возвращает 0 результатов.

Всё дело в том, что имя элемента совсем не url, а http://www.sitemaps.org/schemas/sitemap/0.9 url из-за чего этот XPath и не срабатывает. А самое простое решение для этого — использовать функцию local-name(), которая возвращает имя тега без учета namespaces: $x('//*[local-name()="url"]')

Вот так, легко и просто. Хотя для XML по-сложнее, лучше конечно разобраться с namespaces ;-)


comments powered by HyperComments
Яндекс.Метрика