有没有用于解析带有冒号的标签名称的PHP库?

40
我一直在尝试使用SimpleXML,但它似乎不喜欢这样的XML格式:
<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div>

那么,哪个库可以处理那样的标签(其中有冒号)?

1
请发布相关的代码片段。SimpleXML在命名空间方面不应该有任何问题。 - Josh Davis
我也遇到了同样的问题,如果XML数据中的标签有冒号,SimpleXMLElement($data)会返回null。 - Jake Wilson
4个回答

89

假设你有一个类似这样的 XML。

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

您可以像这样访问'em':$xml->children('xhtml', true)->div->em;

但是,如果您想要日期字段,这个代码 $xml->children('xhtml', true)->div->date; 将不起作用,因为您被困在xhtml命名空间中。

您必须再次执行'children'以返回默认命名空间:

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

1
不确定为什么这不是被选中的答案。但是对于未来遇到类似问题的人来说,这个才是解决我的问题的答案! :) - daveomcd
多个标签带有“:”怎么办?这是我尝试访问它的方式:$array['body']['Order']['Extensions']['data:AdditionalReferences']['data:YourRef'] - user2924019

28

如果您想快速解决它,请执行以下操作(当我感到懒时,我会这样做)

// 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_。这种方法有些hacky,如果涉及到CDATA命名空间XML容器块或UNICODE标记名称,则可能会失败,但我认为通常情况下使用它是安全的 (至少迄今为止没有让我失望)


可以运行,但有点不太正规。它搞乱了我的<pubDate>标签的内容并改变了时间。 - supersan

6

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


SimpleXML 也可能可以,但 OP 正在寻找一个标签 "xhtml:div" 而不仅仅是 "div"。 - Matthew Scharley
SimpleXML有一些处理它的东西,但我仍然无法使其正常工作。 - mpen

2
我认为不应该像一些人建议的那样去除冒号或用其他东西替代它。你可以轻松访问具有命名空间前缀的元素。你可以将标识命名空间的 URL 作为参数传递给 children() 方法,或者将命名空间前缀和 "true" 一起传递给 children() 方法。第二种方法需要 PHP 5.2 及以上版本。 SimpleXMLElement::children

这难道不就是我所接受的答案中Nathan Reed所建议的吗?我同意正则表达式并不是个好方法,但通过children()选择器也不是很有趣。 - mpen
是的,没错。我只是想表明,你也可以将标识命名空间的URL传递给children()方法,该方法适用于PHP 5及以上版本。在我看来,当有核心方法可用时,没有必要进行肮脏的黑客攻击。 - Patryk K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接