3

xml ファイルの一部のノードが解析されて正しく表示され、他のノードが検出されないという問題が発生しています (少なくとも、ここで何が問題なのかわかりません)。

xml ファイルを投稿する代わりに、そのファイルへのリンクを提供します。XML 構造を確認するための小さな XML スニペットを次に示します。

<offers version="1"><group name="games">
    <o id="1" url="http://inexus.us/world-of-warcraft-eu/pre-paid-game-time-card-60-days" price="21.53" avail="1">
        <name>World of Warcraft EU Pre-Paid Game Time Card 60 Days</name>
        <currency>
            EUR
        </currency>
    </o>

現在、このコードを使用してxmlファイルを解析/読み取りしています。

$xmlDOM = new DOMDocument();
$xmlDOM->load("http://inexus.us/compare.xml");
$document = $xmlDOM->documentElement;
foreach ($document->childNodes as $node) {
    if ($node->hasChildNodes()) {
        foreach($node->childNodes as $temp) {
            echo $temp->nodeName."=".$temp->nodeValue."<br />";

        }
    }
}

そのコードを使用して、各要素のを取得していますが、要素 内に格納されている情報も取得する必要があります... (つまりname、、、 ) しかし、それらにアクセスする方法がよくわかりません。ooidurlprice

また、出力はいくつかの#text=ブロックを返します。(これはxmlの空白が原因で発生すると思いますか?)

出力の小さなスニペット:

#text=
#text=
o= World of Warcraft EU Pre-Paid Game Time Card 60 Days EUR
#text=
o= World of Warcraft EU Battle Chest cd-key EUR
#text=
o= World of Warcraft EU Cataclysm cd-key EUR
#text= 

どんな助け/ヒントも大歓迎です!

4

3 に答える 3

2

#text空白を処理する必要があります。を使用できますがpreserveWhiteSpace = false(以下を参照)、これを使用する前に覚えておく必要がありますload()

アトリビュートについては、 を使用してノードにアトリビュートがあるhasAttributes()ことを確認し、 を使用してノードのアトリビュートを反復処理できますattributes

以下の例では、ショートカットを使用してすべてのoタグを取得しています。

<?php
$xmlDOM = new DOMDocument();
$xmlDOM->preserveWhiteSpace = false;
$xmlDOM->load("http://inexus.us/compare.xml");
$offers = $xmlDOM->getElementsByTagName('o');
foreach ($offers as $offer) {
    if($offer->hasAttributes()){
        foreach($offer->attributes as $attr){
            $name = $attr->nodeName;
            $value = $attr->nodeValue;
            echo $name.' = '.$value.'<br>';
        }
    }
    if ($offer->hasChildNodes()) {

        foreach($offer->childNodes as $o) {
            echo $o->nodeName."=".$o->nodeValue."<br />";

        }
    }
    echo '<hr>';
}?>
于 2013-03-08T15:23:21.950 に答える
1

このようなXMLドキュメントの場合、ほとんどの場合、SimpleXMLで処理する方が簡単です。一般的に、探しているものは属性と呼ばれます。要素の子であるテキスト値の横に 、要素にも属性があります。

SimpleXMLでは、アクセスはかなり簡単です。要素の属性へのアクセスは、配列表記と文字列キーを使用します。

$game['id']; # id attribute of $game (here the <o> element)

子にアクセスするには(多くの場合、のように子が1つしかない場合<name>)、child-element-nameを介して子にアクセスします。

$game->name; # (first) name child element of $game

また、文字列コンテキストで(たとえば、文字列パラメータとして、echoまたはキャストとして(string) $game->name)使用すると、要素ではなく内部のテキスト値が返されます。

これがいくつかのサンプルコードです(これも単純なものを使用していますxpath):

$url = 'http://inexus.us/compare.xml';
$xml = simplexml_load_file($url);

foreach($xml->xpath('/*/group/o') as $index => $game)
{
    printf("[%04d] %' -48s  %' 5s %s\n       <%s>\n",
        $game['id'],            # id attribute
        trim($game->name),      # name child text value
        $game['price'],         # price attribute
        trim($game->currency),  # currency child text value
        $game['url']            # url attribute
    );
}

そしてこれは出力です:

[0001] World of Warcraft EU Pre-Paid Game Time Card 60 Days  21.43 EUR
       <http://inexus.us/world-of-warcraft-eu/pre-paid-game-time-card-60-days>
[0003] World of Warcraft EU Battle Chest cd-key          10.31 EUR
       <http://inexus.us/world-of-warcraft-eu/battle-chest-cd-key>
[0668] World of Warcraft EU Cataclysm cd-key              6.18 EUR
       <http://inexus.us/world-of-warcraft-eu/cataclysm-cd-key>
[0954] World of Warcraft EU Mists of Pandaria cd-key     18.80 EUR
       <http://inexus.us/world-of-warcraft-eu/mists-of-pandaria-cd-key>
[0988] World of Warcraft EU Battle Chest + Cataclysm cd-key  15.48 EUR
       <http://inexus.us/world-of-warcraft-eu/battle-chest-cataclysm-cd-key>
[0018] Eve Online Pre-Paid Card 60 Days Special Edition  28.40 EUR
       <http://inexus.us/eve-online/pre-paid-card-60-days-special-edition>
[0766] Eve Online +30 Days cd-key                        11.60 EUR
       <http://inexus.us/eve-online/30-days-cd-key>
[1057] Eve Online Pre-Paid Card 60 Days                  25.82 EUR
       <http://inexus.us/eve-online/pre-paid-card-60-days>
[0029] Sony Online Pre-Paid 30 days EU                   14.19 EUR
       <http://inexus.us/sony-online/pre-paid-30-days-eu>
...

デモ

于 2013-03-08T16:37:06.637 に答える
1

でアクセスできるプロパティの完全なリストについては、ドキュメントを確認してくださいDOMNode。ご質問について:

  1. attributesのプロパティをチェックして$temp、すべての属性にアクセスできるようにします。であるDOMNamedNodeMapため、(たとえば)次のようにアクセスできます。

    foreach ($temp->attributes as $name => $attrNode) {
        echo $name."=".$attrNode."<br />";
    }
    
  2. 結果に含める前に をテストすることで、不要なTextノードを排除できます。nodeTypeXML_ELEMENT_NODE

于 2013-03-08T15:16:38.237 に答える