用于使用标记名称中的冒号解析XML的PHP​​库?

时间:2009-10-16 00:09:11

标签: php xml namespaces simplexml

我一直在尝试使用SimpleXML,但似乎不喜欢XML看起来像这样:

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

那么什么库会处理看起来像这样的标签(在它们中有冒号)?

4 个答案:

答案 0 :(得分:70)

假设您有一些像这样的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 :(得分:22)

如果你想快速修复它,请执行(当我感到懒惰的时候这样做)

// 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会失败,但我会说你通常使用它(还没有让我失败)

答案 2 :(得分:6)

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

答案 3 :(得分:1)

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

SimpleXMLElement::children