Слушатель событий звонил слишком рано

Определение пространств имен в XPath (рекомендуется)

У самого XPath нет способа связать префикс пространства имен с пространством имен. Такие средства предоставляются библиотекой хостинга.

Рекомендуется использовать эти средства и определять префиксы пространства имен, которые затем могут использоваться для квалифицирования XML-элементов и имен атрибутов по мере необходимости.


Вот некоторые из различных механизмов, которые хосты XPath предоставляют для указания привязок префикса пространства имен к URI пространства имен:

XSLT:


   ...

Perl ( LibXML ):

my $xc = XML::LibXML::XPathContext->new($doc);
$xc->registerNs('i', 'http://schema.intuit.com/finance/v3');
my @nodes = $xc->findnodes('/i:IntuitResponse/i:QueryResponse');

Python ( lxml ):

from lxml import etree
f = StringIO('...')
doc = etree.parse(f)
r = doc.xpath('/i:IntuitResponse/i:QueryResponse', 
              namespaces={'i':'http://schema.intuit.com/finance/v3'})

Python ( ElementTree ):

namespaces = {'i': 'http://schema.intuit.com/finance/v3'}
root.findall('/i:IntuitResponse/i:QueryResponse', namespaces)

Java (SAX):

NamespaceSupport support = new NamespaceSupport();
support.pushContext();
support.declarePrefix("i", "http://schema.intuit.com/finance/v3");

Java (XPath):

xpath.setNamespaceContext(new NamespaceContext() {
    public String getNamespaceURI(String prefix) {
      switch (prefix) {
        case "i": return "http://schema.intuit.com/finance/v3";
        // ...
       }
    });

C #:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("i", "http://schema.intuit.com/finance/v3");
XmlNodeList nodes = el.SelectNodes(@"/i:IntuitResponse/i:QueryResponse", nsmgr);

xmlstarlet:

-N i="http://schema.intuit.com/finance/v3"

JavaScript:

См. Реализация разрешенного пользователем пространства имен Resolver :

function nsResolver(prefix) {
  var ns = {
    'i' : 'http://schema.intuit.com/finance/v3'
  };
  return ns[prefix] || null;
}
document.evaluate( '/i:IntuitResponse/i:QueryResponse', 
                   document, nsResolver, XPathResult.ANY_TYPE, 
                   null );

PhP :

Адаптировано из @ ответа Томалака с использованием DOMDocument :

$result = new DOMDocument();
$result->loadXML($xml);

$xpath = new DOMXpath($result);
$xpath->registerNamespace("i", "http://schema.intuit.com/finance/v3");

$result = $xpath->query("/i:IntuitResponse/i:QueryResponse");

См. также @ Канонический Q / A IMSoP на PHP Пространства имен SimpleXML .

VBA:

xmlNS = "xmlns:i='http://schema.intuit.com/finance/v3'"
doc.setProperty "SelectionNamespaces", xmlNS  
Set queryResponseElement =doc.SelectSingleNode("/i:IntuitResponse/i:QueryResponse")

Как только вы объявили префикс пространства имен, ваш XPath можно записать, чтобы использовать его:

/i:IntuitResponse/i:QueryResponse

Поражение пространств имен в XPath (не рекомендуется)

Альтернативой является запись предикатов, которые проверяют на local-name():

/*[local-name()='IntuitResponse']/*[local-name()='QueryResponse']/@startPosition

Или, в XPath 2.0:

/*:IntuitResponse/*:QueryResponse/@startPosition

Пространство имен в этом стиле работает, но не рекомендуется, потому что оно

  • Под-указывает полное имя элемента / атрибута.
  • Не удается различать имена элементов / атрибутов в разных пространствах имен (сама цель пространств имен). Обратите внимание, что эту проблему можно решить, добавив дополнительный предикат, чтобы проверить URI пространства имен явно1:
    /*[    namespace-uri()='http://schema.intuit.com/finance/v3' 
       and local-name()='IntuitResponse']
    /*[    namespace-uri()='http://schema.intuit.com/finance/v3' 
       and local-name()='QueryResponse']
    /@startPosition
    
    1Подается Даниэль Хейли для примечания namespace-uri().
  • Является чрезмерно подробным .
0
задан Seth Killian 28 March 2019 в 03:45
поделиться