2

私はファイルtest.xmlを持っています

<?xml version="1.0" encoding="UTF-8"?>
<item>
<dc:creator><![CDATA[hello world]]></dc:creator>
</item>

およびコードphp

$doc = new DOMDocument();
$doc->load('test.xml');
$items = $doc->getElementsByTagName('item');
foreach ($items as $item) {
   $authors = $item->getElementsByTagName( "dc:creator" );
   $author = $authors->item(0)->nodeValue;
   echo $author;
}

=> エラーで値を取得できません。これを取得する方法、結果は「hello world」です

4

1 に答える 1

3

間違った要素名を使用しています。メソッドは、あなたの場合getElementsByTagNameのローカル名を期待していcreatorます。

サンプル XML をロードすると、

<?xml version="1.0" encoding="UTF-8"?>
<item>
<dc:creator><![CDATA[hello world]]></dc:creator>
</item>

DOMDocument に。次の警告が表示されます。

警告: DOMDocument::loadXML(): 作成者の名前空間プレフィックス dc がエンティティで定義されていません

名前空間プレフィックスが定義されていないため、DOMDocument はそれを削除します。これにより、次の XML が生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<item xmlns:dc="ns:1">
<creator><![CDATA[hello world 2]]></creator>
</item>

ご覧のとおり、ローカル名 creatorxmlns-prefix dc ( <dc:creator>) が付いた要素はもうありません。

しかし、例に間違った XML を貼り付けたようで、名前空間プレフィックス実際の XML で定義されている可能性が高いため、名前空間プレフィックス (コロンの前の部分) を持つタグにアクセスする方法を尋ねているだけです:。これはすでにここで概説されています:

タグが独自の名前空間内にある要素が必要な場合は、DOMDocumentにどの名前空間を意味するかを伝える必要があります。

$dcUri   = $doc->lookupNamespaceUri('dc');
$authors = $item->getElementsByTagNameNS($dcUri, 'creator');
$author  = $authors->item(0)->nodeValue;
于 2013-04-09T08:08:43.387 に答える