用于解析带有冒号名称中的冒号的XML的PHP​​库?

问题描述:

我一直在试图使用SimpleXML,但它似乎不喜欢XML,看起来像这样:用于解析带有冒号名称中的冒号的XML的PHP​​库?

<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div> 

那么库将处理这个看起来像标签(在他们冒号)?

+1

请发表相关的代码片段。 SimpleXML不应该对命名空间有任何问题。 – 2009-10-16 01:58:42

+0

我也遇到过'SimpleXMLElement($ data)'如果xml数据在标签中有冒号返回null的相同问题。 – 2012-10-12 19:11:04

假设你有一些这样的xml。

<xhtml:div> 
    <xhtml:em>italic</xhtml:em> 
    <date>2010-02-01 06:00</date> 
</xhtml:div> 

你可以 '时间' 这样的访问:但是$xml->children('xhtml', true)->div->em;

,如果你想日期字段,这样的:$xml->children('xhtml', true)->div->date;不会工作,因为你是停留在XHTML命名空间。

你必须执行“孩子”再次回到默认的命名空间:

$xml->children('xhtml', true)->div->children()->date; 
+1

不知道为什么这不是选定的答案。但对于将来的任何人来说,这是解决我的问题/问题的人! :) – daveomcd 2011-05-18 16:22:43

冒号表示XML名称空间。 DOM对命名空间有很好的支持。

+0

SimpleXML可能也会这样,但OP正在寻找一个标签“xhtml:div”而不是“div”。 – 2009-10-16 00:15:03

+0

SimpleXML有*一些*处理它的东西,但我仍然无法让它正常工作。 – mpen 2009-10-16 01:44:18

如果你要修复它迅速做到这一点(我做的时候,我觉得懒惰)

// Will replace : in tags and attributes names with _ allowing easy access 
$xml = preg_replace('~(</?|\s)([a-z0-9_]+):~is', '$1$2_', $xml); 

这会将<xhtml:转换为<xhtml_</xhtml:</xhtml_。 如果涉及到CDATA NameSpaced XML容器块或UNICODE标签名称,但是我会说你通常使用它的安全性,那么这种hacky可能会失败(还没有失败)

+4

这很脏。但很好;) – joedevon 2011-11-23 20:29:34

+0

工程,但它有点哈克..拧我的''标签的内容,并改变了时间 – supersan 2017-06-22 04:47:17

我不认为这是一个好主意,以摆脱冒号或用别人的建议替换它。您可以轻松访问具有名称空间前缀的元素。您可以将标识名称空间的URL作为参数传递给children()方法,也可以将名称空间前缀和“true”传递给children()方法。第二种方法需要PHP 5.2及更高版本。

SimpleXMLElement::children

+0

这不正是纳森里德在我接受的答案中建议的?我同意regex-fu是一个肮脏的黑客攻击,但不得不通过'children()'选择器也不是很有趣。 – mpen 2013-02-22 17:06:24

+0

是的,一样的。我只是想表明,您也可以将标识命名空间的URL传递给PHP(以及PHP 5以上)的children()方法。恕我直言,没有必要做一个肮脏的黑客,当有核心方法可用。 – 2013-02-22 17:22:46