我一直在试图使用SimpleXML,但它似乎不喜欢XML,看起来像这样:用于解析带有冒号名称中的冒号的XML的PHP库?
<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div>
那么库将处理这个看起来像标签(在他们冒号)?
我一直在试图使用SimpleXML,但它似乎不喜欢XML,看起来像这样:用于解析带有冒号名称中的冒号的XML的PHP库?
<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div>
那么库将处理这个看起来像标签(在他们冒号)?
假设你有一些这样的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;
不知道为什么这不是选定的答案。但对于将来的任何人来说,这是解决我的问题/问题的人! :) – daveomcd 2011-05-18 16:22:43
如果你要修复它迅速做到这一点(我做的时候,我觉得懒惰):
// 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可能会失败(还没有失败)。
我不认为这是一个好主意,以摆脱冒号或用别人的建议替换它。您可以轻松访问具有名称空间前缀的元素。您可以将标识名称空间的URL作为参数传递给children()方法,也可以将名称空间前缀和“true”传递给children()方法。第二种方法需要PHP 5.2及更高版本。
这不正是纳森里德在我接受的答案中建议的?我同意regex-fu是一个肮脏的黑客攻击,但不得不通过'children()'选择器也不是很有趣。 – mpen 2013-02-22 17:06:24
是的,一样的。我只是想表明,您也可以将标识命名空间的URL传递给PHP(以及PHP 5以上)的children()方法。恕我直言,没有必要做一个肮脏的黑客,当有核心方法可用。 – 2013-02-22 17:22:46
请发表相关的代码片段。 SimpleXML不应该对命名空间有任何问题。 – 2009-10-16 01:58:42
我也遇到过'SimpleXMLElement($ data)'如果xml数据在标签中有冒号返回null的相同问题。 – 2012-10-12 19:11:04