2017-01-05 1 views
0

xmlからデータを抽出したい。私はこのPHPコードxmlからテキストノードを取得する方法

$xml = simplexml_load_string($xmlString); 
$json = json_encode($xml); 
$obj = json_decode($json); 
print_r($obj); 

を実行

<root> 
    <p>Some text</p> 
    <p>Even more text</p> 
    <span class="bla bla"> 
     <span class="currency">EUR</span> 19.95 
    </span> 
</root> 

、その後、結果は次のとおりです:

私はこのXMLを持って

stdClass Object 
(
    [p] => Array 
     (
      [0] => Some text 
      [1] => Even more text 
     ) 

    [span] => stdClass Object 
     (
      [@attributes] => stdClass Object 
       (
        [class] => bla bla 
       ) 

      [span] => EUR 
     ) 
) 

私は不足している文字列を取得するにはどうすればよいです」 19.95 "?

答えて

0

XMLをJSON /配列に変換しないでください。それはあなたが情報と機能を失っていることを意味します。

SimpleXMLは基本的なXMLで動作しますが、混在ノードのようなものには問題があります。 DOMでは、この場合の処理​​が容易になります。

$xml = <<<'XML' 
<root> 
    <p>Some text</p> 
    <p>Even more text</p> 
    <span class="bla bla"> 
     <span class="currency">EUR</span> 19.95 
    </span> 
</root> 
XML; 

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach($xpath->evaluate('/root/span[@class="bla bla"]') as $span) { 
    var_dump(
    $xpath->evaluate('string(span[@class="currency"][1])', $span), 
    $xpath->evaluate(
     'number(span[@class="currency"][1]/following-sibling::text()[1])', 
     $span 
    ) 
); 
} 

Xpathは、DOM(Think SQL for XML)の一部をフェッチするための式言語です。 PHPにはいくつかの方法があります。 SimpleXMLElement::xpath()では、SimpleXMLElementオブジェクトの配列としてノードを取得できます。 DOMXpath::query()では、ノードリストを取得できます。 DOMXpath::evaluate()のみがノードリストとスカラー値をフェッチできます。

この例では、/root/span[@class="bla bla"]は、指定されたクラス属性を持つすべてのspan要素ノードをフェッチします。各ノードについて、クラス通貨を文字列としてspanをフェッチします。 3番目の式は、currencyスパンの最初の次の兄弟テキストノードを番号としてフェッチします。

+0

これにはXPathを使ったすっきりしたトリックが含まれていますが、これは説明されているタスクにとって非常に過酷です。 SimpleXMLは 'print_r'の不完全な出力を除いて、このXMLにはまったく問題がありません。 – IMSoP

0

デバッグ出力を信頼しないでください。また、JSONまたは配列に変換しないでください。

echo $xml->span; 

または変数にそれを得るために、明示的に文字列にキャスト:

$foo = (string)$xml->span 

するか、したい場合は、この文字列を出力

は、要素に移動し、それをエコーするのと同じくらい簡単ですThWの答えのようにXPathを使用するには、//span[@class="bla bla"]を使用して範囲を見つけることができます(->xpath()は配列を返しますので、その配列の要素0が必要です)。

echo $xml->xpath('//span[@class="bla bla"]')[0]; 
関連する問題