• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • SimpleXMLElement::registerXPathNamespace()

    (PHP 5 >= 5.1.0, PHP 7)

    Creates a prefix/ns context for the next XPath query

    说明

    publicSimpleXMLElement::registerXPathNamespace(string $prefix,string $ns): bool

    Creates a prefix/ns context for the next XPath query. In particular, this is helpful if the provider of the given XML document alters the namespace prefixes.registerXPathNamespacewill create a prefix for the associated namespace, allowing one to access nodes in that namespace without the need to change code to allow for the new prefixes dictated by the provider.

    参数

    $prefix

    The namespace prefix to use in the XPath query for the namespace given in$ns.

    $ns

    The namespace to use for the XPath query. This must match a namespace in use by the XML document or the XPath query using$prefixwill not return any results.

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    范例

    Example #1 Setting a namespace prefix to use in an XPath query

    <?php
    $xml = <<<EOD
    <book xmlns:chap="http://example.org/chapter-title">
        <title>My Book</title>
        <chapter id="1">
            <chap:title>Chapter 1</chap:title>
            <para>Donec velit. Nullam eget tellus vitae tortor gravida scelerisque. 
                In orci lorem, cursus imperdiet, ultricies non, hendrerit et, orci. 
                Nulla facilisi. Nullam velit nisl, laoreet id, condimentum ut, 
                ultricies id, mauris.</para>
        </chapter>
        <chapter id="2">
            <chap:title>Chapter 2</chap:title>
            <para>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin 
                gravida. Phasellus tincidunt massa vel urna. Proin adipiscing quam 
                vitae odio. Sed dictum. Ut tincidunt lorem ac lorem. Duis eros 
                tellus, pharetra id, faucibus eu, dapibus dictum, odio.</para>
        </chapter>
    </book>
    EOD;
    $sxe = new SimpleXMLElement($xml);
    $sxe->registerXPathNamespace('c', 'http://example.org/chapter-title');
    $result = $sxe->xpath('//c:title');
    foreach ($result as $title) {
      echo $title . "\n";
    }
    ?>
    

    以上例程会输出:

    Chapter 1
    Chapter 2
    

    Notice how the XML document shown in the example sets a namespace with a prefix ofchap. Imagine that this document(or another one like it)may have used a prefix ofcin the past for the same namespace. Since it has changed, the XPath query will no longer return the proper results and the query will require modification. UsingregisterXPathNamespaceavoids future modification of the query even if the provider changes the namespace prefix.

    参见

    • SimpleXMLElement::xpath() Runs XPath query on XML data
    • SimpleXMLElement::getDocNamespaces() Returns namespaces declared in document
    • SimpleXMLElement::getNamespaces() Returns namespaces used in document
    Looks like you have to use registerXPathNamespace for each node when using XPath:
    <?php
    $xml = simplexml_load_file($filename);
    $xml->registerXPathNamespace('test', 'http://example.com');
    $shopping_element = $xml->xpath('test:shopping-list');
    // Breaks with out the following line:
    $shopping_element->registerXPathNamespace('test', 'http://example.com');
    $fruit = $shopping_element->xpath('test:fruit');
    ?>