使用PHP从XML中删除命名空间

jch*_*mpo 18 php simplexml xml-namespaces

我有一个XML文档,如下所示:

<Data 
  xmlns="http://www.domain.com/schema/data" 
  xmlns:dmd="http://www.domain.com/schema/data-metadata"
>
  <Something>...</Something>
</Data>
Run Code Online (Sandbox Code Playgroud)

我正在使用PHP中的SimpleXML解析信息.我正在处理数组,我似乎遇到了命名空间的问题.

我的问题是:如何删除这些名称空间?我从XML文件中读取数据.

谢谢!

nul*_*ull 16

如果您正在使用XPath,那么它是XPath的限制,而不是 PHP在xpath和默认命名空间上查看此解释以获取更多信息.

更具体地说,它是xmlns=""根节点中导致问题的属性.这意味着您需要注册命名空间,然后使用QName来引用元素.

$feed = simplexml_load_file('http://www.sitepoint.com/recent.rdf');
$feed->registerXPathNamespace("a", "http://www.domain.com/schema/data");
$result = $feed->xpath("a:Data/a:Something/...");
Run Code Online (Sandbox Code Playgroud)

要点:registerXPathNamespace调用中使用的URI 必须与实际XML文件中使用的URI 相同.

  • 请注意**重要**部分。我第一次看到这个答案时就错过了。 (2认同)

小智 14

我发现上面的答案很有帮助,但它对我来说并不适用.最终效果更好:

// Gets rid of all namespace definitions 
$xml_string = preg_replace('/xmlns[^=]*="[^"]*"/i', '', $xml_string);

// Gets rid of all namespace references
$xml_string = preg_replace('/[a-zA-Z]+:([a-zA-Z]+[=>])/', '$1', $xml_string);
Run Code Online (Sandbox Code Playgroud)

  • 我会用这样的东西摆脱"所有命名空间引用":$ xml = preg_replace('/(<\/*)[^>:] +:/','$ 1',$ xml); (4认同)