0

私が取り組んでいるXMLは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:noo="http://www.myscheme.com/schema">
    <channel>
        <item>
            <title>A Simple Title</title>
            <noo:subcategory>the sub category</noo:subcategory>
            <noo:relatedInfos>
                <noo:teams>
                    <noo:team id="3">New York</noo:team>
                    <noo:team id="4">Las Vegas</noo:team>
                </noo:teams>
            </noo:relatedInfos>
        </item>
    </channel>
</rss>

2つの「チーム」を取得するためにこのphpコードを実行していますが、機能しません($xmlには以前のコンテンツがあります):

$xml_datas = simplexml_load_string($xml);

foreach($xml_datas->channel->item as $item){                      
    $noo = $item->children('noo');
    echo $noo->team;
}

なぜそれが機能していないのか分かりますか?

ありがとう

4

2 に答える 2

0

「noo」はその名前空間の単なるローカルエイリアスであり、メソッド(およびほとんどのXML処理関数)は、属性->children()のURIである実際のグローバル識別子を知りたいと考えています。xmlns

名前空間の完全な識別子(つまり->children('http://www.myscheme.com/schema'))を指定するか、オプションの2番目のパラメータを設定してSimpleXMLにプレフィックスを検索するように指示する必要があります( ->children('noo', true)2番目の方が読みやすいかもしれませんが、将来のドキュメントに同じスキーマがあると壊れます。ただし、名前空間に別のローカルエイリアスを指定します。

さらに、teamノードはノードの真下にないitemため、ノードを取得するにはさらにトラバースする必要があります。

// Give the namespace a readable name that won't change
define('NS_NOO', 'http://www.myscheme.com/schema');

$xml_datas = simplexml_load_string($xml);

foreach($xml_datas->channel->item as $item){                      
    $teams = $item->children(NS_NOO)->relatedInfo->teams;
    echo $teams->team[0];
}
于 2013-01-22T00:02:14.323 に答える
0

これが役立つかどうかを確認してください:

<?php // RAY_temp_userco.php
error_reporting(E_ALL);

$xml = <<<ENDXML
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:noo="http://www.myscheme.com/schema">
    <channel>
        <item>
            <title>A Simple Title</title>
            <noo:subcategory>the sub category</noo:subcategory>
            <noo:relatedInfos>
                <noo:teams>
                    <noo:team id="3">New York</noo:team>
                    <noo:team id="4">Las Vegas</noo:team>
                </noo:teams>
            </noo:relatedInfos>
        </item>
    </channel>
</rss>
ENDXML;

$obj = simplexml_load_string($xml);

$ns = $obj->getNamespaces(TRUE);

foreach($obj->channel->item as $item){
    $noo = $item->children($ns['noo']);
    var_dump($noo);
}
于 2013-01-21T17:51:03.293 に答える