代码之家  ›  专栏  ›  技术社区  ›  A806

在php中忽略带有xpath的命名空间

  •  3
  • A806  · 技术社区  · 8 年前

    我想从xml文件中提取一些标记。xml文件可能如下所示:

    <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="de">
    [... some more tags ...]
      <page>
        <title>Title 1</title>
        [... some more tags ...]
      </page>
      <page>
        <title>Title 2</title>
        [... some more tags ...]
      </page>
    </mediawiki>
    

    当我使用 https://www.freeformatter.com/xpath-tester.html

    但当我使用以下php时:

    $xml = simplexml_load_file('articles.xml');
    $result = $xml->xpath('//title');
    var_dump($result);
    

    有没有简单的方法告诉xpath忽略名称空间? (如果没有办法忽略它:为了避免更改URL的问题,最简单和持久的解决方案是什么?)

    foreach ($xml->page as $page) {
      $title = $page->title;
      //[... do something ...]
    }
    

    2 回复  |  直到 8 年前
        1
  •  2
  •   Nigel Ren    8 年前

    您可以从文档中获取名称空间,然后从中注册默认名称空间。这有点麻烦,因为默认名称空间以一个空白键结束,但这就是为什么从数组中获取第一个值然后使用它有点假。

    所以代码是这样的:

    $xml = simplexml_load_file('articles.xml');
    $ns = $xml->getDocNamespaces();
    $xml->registerXPathNamespace('def', array_values($ns)[0]);
    $result = $xml->xpath('//def:title');
    var_dump($result);
    
        2
  •  0
  •   Eaten by a Grue kackleyjm    7 年前

    显得 为了在php中使用DOM工具实现这一点,我不得不求助于正则表达式。让我说, 我真的很讨厌这样做

    无论如何,以下是对我有效的方法:

    $xml = file_get_contents('my_document.xml');
    $xml = preg_replace('/(xmlns|xsi)[^=]*="[^"]*" ?/i', '', $xml);
    $doc = simplexml_load_string($xml);
    

    $result = $xml->xpath('//title');
    

    根据您的文档,这可能是一个非常糟糕的主意,尤其是如果您的元素上有命名空间前缀,但在许多基本情况下,它可以正常工作。

    推荐文章