XPath и XML с пространствами имен - PullRequest
1 голос
/ 11 февраля 2011

У меня есть следующий XML:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAgence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns="http://www.artos.co.il/">
  <Agence>
    <CodeAval>20008</CodeAval>
    <CodeSource>ArtPO</CodeSource>
    <LogicielSource>NTLIS</LogicielSource>
</Agence>
</ArrayOfAgence>

Я хочу получить значение CodeAval, поэтому я попытался:

ArrayOfAgence/Agence/CodeAval

Очевидно, что это не сработало, так как у этого XML есть пространство имен, так как мне к нему подойти?

Спасибо

Ответы [ 2 ]

5 голосов
/ 11 февраля 2011

Вы упомянули в комментарии, что используете этот XPath в XSLT. В этом случае вам необходимо добавить определение пространства имен с префиксом для пространства имен по умолчанию для входных документов http://www.artos.co.il/, а затем использовать этот префикс в выражении XPath.

Пример определения пространства имен (оно не обязательно должно быть в элементе stylesheet)

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:artos="http://www.artos.co.il/">

Пример использования префикса в выражении XPath

<xsl:value-of select="artos:ArrayOfAgence/artos:Agence/artos:CodeAval"/>

Обратите внимание на добавленный префикс перед каждым именем элемента.

4 голосов
/ 11 февраля 2011

Если ваша библиотека XPath осведомлена о пространстве имен (что, похоже, ваша), она должна предоставить вам путь к псевдонимам пространств имен.

Например, если вы используете Java, то у объекта javax.xml.xpath.XPath есть метод setNamespaceContext(NamespaceContext context), который позволяет вам предоставить преобразователь пространства имен.

Итак, вы можете сказать ему, что a является псевдонимом для пространства имен http://www.artos.co.il/, и тогда ваш запрос станет a:ArrayOfAgence/a:Agence/a:CodeAval

...