2017-11-13 5 views
0

を設定されている場合、私は、このような構造のXML文書があります。PHP/XML - チェックノードは

<produkter> 
    <produkt> 
     <forhandler></forhandler> 
     <produktnavn></produktnavn> 
     and so on... 
    </produkt> 
</produkter> 

を私はこのようなデータを引き出しています:

$produktnavn = utf8_decode($xmlObject->item($i)->getElementsByTagName('produktnavn')->item(0)->childNodes->item(0)->nodeValue); 

は今、私がやって探していますそのノードがXML文書にまったく存在するかどうかを確認するチェック。

たとえば、実際には「produktnavn」というノードがある場合のみ、上記の操作を行いたいと思います。

私がしようとしています:

if (isset($xmlObject->item($i)->forhandler)) { 

しかし、これは動作するようには思えません。

どうしたのですか?

+0

あなたは「動作するようには思えない」によって何を意味するのか明確にしてください。あなたは何を見たいと思っていますか、代わりに何が見えますか? –

+0

無関係なヒント/質問:テキストをISO 8859-1エンコーディングに変換することは間違いありませんか?そうでなければ、[utf8_decode](http://php.net/utf8_decode)はあなたが望む機能ではありません。あなたがすでにこれを理解していればお詫び申し上げますが、私はその機能を誤解して「私のUnicodeをより良くする」という魔法のようなものをたくさん見てきました。 – IMSoP

+0

if(isset($ xmlObject-> item($ i) - forhandler)){ \t \t $ forhandler = utf8_decode($ xmlObject-> item($ i) - > getElementsByTagName( 'forhandler') - > item ) - > childNodes-> item(0) - > nodeValue); } else { \t $ forhandler = "不明"; } $ forhandlerを印刷しているときに「Unknown」と表示されます。 – digitalmads

答えて

0

getElementsByTagNameの結果は常にDOMNodeListあります。そのクラスには、lengthというメンバーがあり、

リスト内のノードの数です。有効な子ノードインデックスの範囲は0〜length-1です。

だから、少なくとも一つの項目がリストに存在しているかどうかをチェックするために、length> 0であることを確認します

$produktnavn_nodes = $xmlObject->item($i)->getElementsByTagName('produktnavn'); 
if ($produktnavn_nodes->length > 0) { 
    $produktnavn = utf8_decode($produktnavn_nodes->item(0)->childNodes->item(0)->nodeValue); 
    // ... do something with $produktnavn 
} 
1

DOMDocumentDOMXPathを使用し、xpath式の長さを確認できます。例えば

$source = <<<SOURCE 
<produkter> 
    <produkt> 
     <forhandler></forhandler> 
     <produktnavn></produktnavn> 
    </produkt> 
</produkter> 
SOURCE; 

$xmlObject = new DOMDocument; 
$xmlObject->loadXML($source); 
$xpath = new DOMXpath($xmlObject); 
$elements = $xpath->query('//produktnavn'); 
if ($elements->length > 0) { 
    // present 
} 
関連する問題