web-dev-qa-db-ja.com

PHPタグ名にコロンを含むXMLを解析するためのライブラリ?

私は SimpleXML を使用しようとしていますが、次のようなXMLは好きではないようです。

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

それで、どのライブラリがそのように見えるタグを処理しますか(それらにコロンがあります)?

32
mpen

このような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;
_
73
Nathan

すぐに修正したい場合は、次のようにしてください((怠惰なときに私は行います)

// 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タグ名が含まれている場合は、ハックの一種で失敗する可能性がありますが、通常は安全に使用できます(まだ失敗していません)

22
EarnestoDev

コロンは、XML名前空間を示します。 [〜#〜] dom [〜#〜] は名前空間を適切にサポートしています。

6
Ollie Saunders

一部の人々が示唆したように、コロンを取り除くか、それを他のものに置き換えるのは良い考えではないと思います。名前空間接頭辞を持つ要素に簡単にアクセスできます。ネームスペースを識別するURLを引数としてchildren()メソッドに渡すか、ネームスペースプレフィックスと "true"をchildren()メソッドに渡すことができます。 2番目のアプローチでは、PHP 5.2以降が必要です。

SimpleXMLElement :: children

1
Patryk K