-1

それは重複していますが、閉鎖された質問のためではありません。ここSOでも、ついに答えが見つかりました。実際の重複: PHP SimpleXML 名前空間の問題

編集: 質問をよく読むと、PHP 名前空間 simplexml の問題の重複ではないことがわかります。「重複の可能性」からの回答は、私の質問に対する回答ではありません。

繰り返します
が、問題はありません$value = $record->children('cap', true)->$title;.(これはすべての「重複の可能性がある」回答です)
コロン付きのタグ内に他のタグがある場合に問題があります。

<tag:something>hello</tag:something> //I parse out hello (this is the 'duplicate questions' answer that I don't need answered)

<tag:something>
 <stuff>hello</stuff> //I cannot grab this. Explanation below.
</tag:something>

編集終了。

元の質問: http://alerts.weather.gov/cap/us.php?x=1にある XML
のタグ内のデータを取得できません(以下の XML のサンプル)。<value>

問題は次の場所にあります。

$array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value;

掴めなかったデータはこれだけで、それ以外のデータは全て掴めていることを確認しました$array[4]

親タグがフォームにある場合、タグからデータを取得する際に問題があります<cap:something>。例えば:

のようなときに 100 を取得できます<cap:something>100</cap:something>。でも、こんな感じだったら100は取れない<cap:something><value>100</value></cap:something>

XML の一部:

<?xml version = '1.0' encoding = 'UTF-8' standalone = 'yes'?>

<feed
xmlns = 'http://www.w3.org/2005/Atom'
xmlns:cap = 'urn:oasis:names:tc:emergency:cap:1.1'
xmlns:ha = 'http://www.alerting.net/namespace/index_1.0'
>
<!-- http-date = Tue, 30 Oct 2012 06:34:00 GMT -->

<id>http://alerts.weather.gov/cap/us.atom</id>
<logo>http://alerts.weather.gov/images/xml_logo.gif</logo>
<generator>NWS CAP Server</generator>
<updated>2012-10-30T14:34:00-04:00</updated>
<author>
<name>w-nws.webmaster@noaa.gov</name>
</author>
<title>Current Watches, Warnings and Advisories for the United States Issued by the    National Weather Service</title>
<link href='http://alerts.weather.gov/cap/us.atom'/>

<entry>
<id>http://alerts.weather.gov/cap/wwacapget.php?x=AK124CCADA8120.BlizzardWarning.124CCAE7BFC0AK.AFGWSWNSB.d32adb45b5c82ec5e486c4cfb96d3fb6</id>
<updated>2012-10-30T05:20:00-08:00</updated>
<published>2012-10-30T05:20:00-08:00</published>
<author>
<name>w-nws.webmaster@noaa.gov</name>
</author>
<title>Blizzard Warning issued October 30 at 5:20AM AKDT until October 31 at 6:00AM AKDT by NWS</title>
<link href='http://alerts.weather.gov/cap/wwacapget.php?x=AK124CCADA8120.BlizzardWarning.124CCAE7BFC0AK.AFGWSWNSB.d32adb45b5c82ec5e486c4cfb96d3fb6'/>
<summary>...BLIZZARD WARNING IN EFFECT UNTIL 6 AM AKDT WEDNESDAY... THE NATIONAL WEATHER SERVICE IN FAIRBANKS HAS ISSUED A BLIZZARD WARNING...WHICH IS IN EFFECT UNTIL 6 AM AKDT WEDNESDAY. * VISIBILITY...NEAR ZERO IN SNOW AND BLOWING SNOW. * WINDS...WEST 35 MPH GUSTING TO 50 MPH. * SNOW...ACCUMULATION 3 INCHES THROUGH TONIGHT.</summary>
<cap:event>Blizzard Warning</cap:event>
<cap:effective>2012-10-30T05:20:00-08:00</cap:effective>
<cap:expires>2012-10-30T16:00:00-08:00</cap:expires>
<cap:status>Actual</cap:status>
<cap:msgType>Alert</cap:msgType>
<cap:category>Met</cap:category>
<cap:urgency>Expected</cap:urgency>
<cap:severity>Severe</cap:severity>
<cap:certainty>Likely</cap:certainty>
<cap:areaDesc>Eastern Beaufort Sea Coast</cap:areaDesc>
<cap:polygon></cap:polygon>
<cap:geocode>
<valueName>FIPS6</valueName>
<value>002185</value>
<valueName>UGC</valueName>
<value>AKZ204</value>
</cap:geocode>
<cap:parameter>
<valueName>VTEC</valueName>
<value>/X.NEW.PAFG.BZ.W.0013.121030T1320Z-121031T1400Z/</value>
</cap:parameter>
</entry>

...//rest of XML...

PHP コード:

ini_set('display_errors','1');

$alert_url = 'http://alerts.weather.gov/cap/us.php?x=1';

$alert_string_xml = file_get_contents($alert_url);

$alert_simple_xml_object = simplexml_load_string($alert_string_xml);

$count = 0;

$tag_entry = 'entry';
$tag_summary = 'summary';
$tag_cap = 'cap';
$tag_event = 'event';
$tag_certainty = 'certainty';
$tag_areaDesc = 'areaDesc';
$tag_geocode = 'geocode';
$tag_value = 'value';

foreach ($alert_simple_xml_object->$tag_entry as $record)
{
    $count++;

    $array = array();
    $array[] = $record->$tag_summary;
    $array[] = $record->children($tag_cap, true)->$tag_event;
    $array[] = $record->children($tag_cap, true)->$tag_certainty;
    $array[] = $record->children($tag_cap, true)->$tag_areaDesc;
    $array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value;
    //$array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value[0]; //doesnt work either


    echo $array[4]; //nothing is echoed

}

最も最近の試み:
名前空間について詳しく読んで、理解を深めました。私はより良い解決策だと思ったことさえ試しました:

//inside the above foreach loop
    $namespaces = $record->getNameSpaces(true);
    $caap = $record->children($namespaces['cap']);
    echo $caap->event; //works (but the first way works too)
    echo $caap->geocode->value; //(STILL does not work. Nothing is echoed)

名前空間を含む親タグを持つ子タグからデータを取得できない理由がわかりません。

4

3 に答える 3

0

エラーと警告を無効にしている場合、直面している問題はそれほど目に見えません。

名前空間エラー:ものの名前空間プレフィックスキャップが定義されていません

エラーを有効にすると、そのメッセージが表示されます。simplexml は名前空間プレフィックスをcap適切に解析できないため、削除されます。

したがって、直接アクセスします。

$xml->stuff->value[1]

そして似ています。次のコード例を考えてみましょう ( demo :

$xml = simplexml_load_string('<entry>
 <cap:stuff>
  <valueName>aaa</valueName>
  <value>000</value>
  <valueName>bbb</valueName>
  <value>111</value>
 </cap:stuff>
</entry>');

echo "\nResult:", $xml->stuff->value[1], "\n\n";
echo "XML:\n", $xml->asXML();

エラーメッセージと$xml、XML 文字列を出力してロードした後の内容を示しています。

Warning: simplexml_load_string(): namespace error : Namespace prefix cap on \ 
                                  stuff is not defined on line 10
Warning: simplexml_load_string():  <cap:stuff> on line 10
Warning: simplexml_load_string():            ^ on line 10

Result:111

XML:
<?xml version="1.0"?>
<entry>
 <stuff>
  <valueName>aaa</valueName>
  <value>000</value>
  <valueName>bbb</valueName>
  <value>111</value>
 </stuff>
</entry>

何かがうまくいくはずのにおいがするのにうまくいかない場合は、常によく見る必要があります。1 つのオプションは、文字列を XML として再度エコーして、simplexml が解析したものを確認することです。もう 1 つのオプションは、エラー レポートを有効にして、警告とエラーを探すことです。多くの場合、詳細情報が含まれています。

于 2012-11-01T14:32:45.703 に答える
0

cap:stuffはルートなので、次のように要素にアクセスします。

$xml = simplexml_load_string($your_xml);
$value_name_0 = $xml->valueName[0];
$value_0 = $xml->value[0];
$value_name_1 = $xml->valueName[1];
$value_1 = $xml->value[1];
于 2012-11-01T14:15:56.667 に答える
0

あなたはおそらくこの機能を探しています。あなたの問題を解決するのに十分なはずの2つの例があります

于 2012-11-01T14:16:11.833 に答える