4

XML の構文解析や PHP の作成に精通していないことから始めましょう。私は自分が取り組んでいることについて調査し、物事をつなぎ合わせてきましたが、行き詰まっています。

基本的な if/else ステートメントを作成しようとしています。ノードが空でない場合は、ノードの内容を書き込みます。

呼び出している XML のスニペットを次に示します。

<channel>
    <item>
      <title>This is a test</title>
      <link />
      <description>Test description</description>
      <category>Test category</category>
      <guid />
    </item>
  </channel>

これが私がこれまでに持っているPHPです:

<?php
    $alerts = simplexml_load_file('example.xml');
    $guid = $alerts->channel->item->guid;

    if ($guid->count() == 0) {
    print "// No alert";
}
    else {
        echo "<div class='emergency-alert'>".$guid."</div>";
}

?>

明らかに、「guid」は空のノードですが、次のように返されます。

<div class="emergency-alert"> </div>

私は何を間違っていますか?:(

PS、私は hasChildren() を試しましたが、それもうまくいきませんでした。

4

3 に答える 3

5

PHP では、空の XML 要素 (コンテンツのない自己終了タグまたは空の開始/終了タグのペア) を表すSimpleXMLElementFALSEが boolean にキャストされます。通常、PHP のすべてのオブジェクトは boolean にキャストされるため、これは少し意外かもしれませんTRUE

var_dump((bool) new SimpleXMLElement("<guid/>")); # bool(false)

var_dump((bool) new SimpleXMLElement("<guid></guid>")); # bool(false)

var_dump((bool) new SimpleXMLElement("<guid> </guid>")); # bool(true)

この特別なルールは PHP マニュアルのboolean への変換に関するドキュメントに記載されています。

<guid>それを利用して、持っている要素が空かどうかを確認できます。ただし、ここで重要なのは、要素を具体的に要求することです。既存のコードで:

$guid = $alerts->channel->item->guid;

特定の要素を求めているのではなく、親要素<guid>の子であるすべてを求めています。<item>これらの種類のSimpleXMLElementオブジェクトは、要素が含まれていない限り、ブール型の true にキャストされます ( の使用と比較してくださいSimpleXMLElement::count())。

それとは異なり、最初の<guid>要素をインデックスで取得すると、そのインデックスのSimpleXMLElementを取得する NULL、要素が存在しない (つまり、要素がない) 場合に取得します<guid>

両方 - 存在しない要素NULLまたは既存の空の要素 - はブール値にキャストfalseされ、if/else ステートメントで簡単に使用できます。

$guid = $alerts->channel->item->guid[0];
                                    ### zero is the index of the first element
if ((bool) $guid) {
    # non-empty, existing <guid> element
} else {
    # empty or non-existing
}

これであなたの質問に答えます。

于 2014-11-01T16:12:14.947 に答える
5

@Wrikkenは正しいです。XPath は、XML ドキュメントを照会するための推奨される方法です。しかし、あなたの質問に答えると、単純なケースでは、SimpleXMLElement を文字列にキャストすることでノード値が空かどうかを確認できます。

if ( !$guid->__toString() ) {
    print "No alert";
}
于 2014-10-30T18:23:40.233 に答える
3
foreach($alerts->xpath("//item/guid[normalize-space(.)!='']") as $guid){
        echo "<div class='emergency-alert'>".$guid."</div>";
}

それは何をするためのものか?

  1. xpath: xml ドキュメントを照会する簡単な方法
  2. normalize-space: 先頭、末尾、および繰り返しの空白が取り除かれた引数文字列 (つまり:<guid> </guid>は空の文字列ではなく、 です' 'が、これは''
  3. .ノードのテキストコンテンツです
于 2014-10-30T17:52:11.273 に答える