2017-06-27 10 views
1

私はsimplexmlで解析することによって.xmlドキュメントの子を呼び出す方法を理解していますが、次のような名前の子を呼び出す際に問題があります。 name2。xmlで子を反復する方法:with simplexmlの名前:

具体的には、この.xmlドキュメントのnhc:centerをエコーし​​ようとしています。http://www.nhc.noaa.gov/nhc_ep4.xml

現在、私のコードは次のようになります。センター::

Parse error: syntax error, unexpected ':', expecting ',' or ';' in C:\xampp\htdocs\test.php on line 5

私はそれを確信している最初の3行は、NHCを呼び出そうとしたときにしかし、私はこのエラーを返す、完璧に動作

<?php 
$xml=simplexml_load_file("http://www.nhc.noaa.gov/nhc_ep4.xml") or die("Error: Cannot create object"); 
echo $xml->channel->title[0] . "<br>"; 
echo $xml->channel->description[0] . "<br><br>"; 
echo $xml->channel->item[0]->nhc:Cyclone->nhc:center . "<br>"; 
?> 

何かシンプルな私はここで行方不明、任意のヘルプが大いに感謝しています!

答えて

0

編集2

この答えは、あまり「ハック」の答えを受け入れた日後ここに掲載されました:https://stackoverflow.com/a/44813107/713874

オリジナル返信

echo $xml->channel->item[0]->{'nhc:Cyclone'}->{'nhc:center'} . "<br>"; 

出典: How do I access this object property with a hyphenated name?

編集:私はあなたのドメインがすべてのパブリックた気づき、それはまだあなたの情報をつかんでいなかった見このように、カーリー・ブラケット、引用符で名前を包む試してみてください。奇妙な。私はそれを解決し、この回避策を見つけた:

$xml = simplexml_load_string(str_replace("nhc:", "nhc", file_get_contents("http://www.nhc.noaa.gov/nhc_ep4.xml")));

+0

これは間違いなくエコー$ xml-> channel-> item [0] - > {'nhc:Cyclone'} - > {'nhc:center'}のエラーを削除しました。 "
"; – USTropics

+1

これはまったく新しい質問ですが、まずは:var_dump($ xml-> channel) 'ならどうしますか? – Bing

+1

@USTropics問題を再現でき、回避策を使用して回答を更新しました。 – Bing

0

コロンは裸のオブジェクトには有効ではありませんあなたがそれらを引用する必要がありますので、属性名:

$xml->channel->item[0]->{'nhc:Cyclone'}->{'nhc:center'} 
+0

A ':' XMLタグに名前空間を表し、要素名の一部ではないので、これが正しいを与えることはありません値。代わりに ' - > children()'メソッドを使って正しい名前空間を選択する必要があります。 – IMSoP

-1

これは、何百回も頼まれていますが、答えはしばしば誤解や過剰固有のものですので、私は素敵な標準的な答えを見つけることができませんので、重複としてこれをマークするために、ここではさらに別の要約です:タグ名で

  • コロン(:は)タグは、「名前空間」であることを示します。
  • コロンの前の部分は "名前空間プレフィックス"です。この特定のドキュメントのローカルであり、ドキュメントの変更の意味(例えば、ファイルが別のアプリケーションによって生成または処理された場合)なしに予告なしに変更される可能性があります。
  • "名前空間識別子"は、ファイルの先頭にxmlns属性を付けてこれにマップされ、URLとしてフォーマットされます。 URLはどこにも向いていませんが、誰かが名前空間を「所有」するための単なる方法です。この場合
  • xmlns:nhc="http://www.nhc.noaa.gov"はSimpleXMLは名前空間http://www.nhc.noaa.gov
  • にプレフィックスnhc:をマッピングし、あなたはthe ->children() methodを使用して、名前空間内の要素にアクセスし、the ->attributes() methodを使用して名前空間の属性。これらは、->foo['bar']などを使用して見ている名前空間を「切り替える」
  • 接頭辞は->children()または->attributes()の引数として使用できますが、これは変わる可能性があるため、通常はURLのどこかに定数が設定されていますので、独自の短い識別子とドンがありますURLを複数の場所に貼り付ける必要があります。

かいつまんで、あなたがこれを記述する必要があります。

// Define a constant to refer to the namespace 
// could be a variable, a class constant, or whatever you like 
define('XMLNS_NHC', 'http://www.nhc.noaa.gov'); 

// Use ->children() to switch to that namespace 
echo $xml->channel->item[0]->children(XMLNS_NHC)->Cyclone->center; 
関連する問題