2011-01-03 16 views
2

与えられたxmlが "atom"か "rss"の形式であるかどうかを判断するPHPコードを書いています。 atomとrss xmlファイルを観察した後、ルート要素に基づいてxmlを分類することにしました。ルート要素が"<feed"の場合、それはアトムxmlです。それが"<rss"なら、それは原子ではありません。xmlがatomかrssかどうかをPHPで調べる

DOMを使用してそのチェックを実行するにはどうすればよいですか?これまでのところ私が持っている:

$dom = new DOMDocument(); 
$dom->loadXML($resp); 
$feed = $dom->getElementsByTagName("feed"); 
if($feed != NULL) 
echo 'it\'s a atom!'; 

が、それはかなり右に動作していないです....エラーがありません、それだけで、それが

+1

どうしますか?エラーはありますか? – BoltClock

+0

次回はcode-formattigを使用してください(ここでは新しいように見えます)。また、いくつかのコードを使ってみてください - yoourコードの '$ dom'は何ですか? – oezi

+0

'$ dom'がDOMDocumentである可能性は確かではありませんが。これは私が知っている唯一のオブジェクトで、loadXMLメソッドを持っています。 – cwallenpoole

答えて

3

私はあなたがヒントをより簡単に得ることができると賭けるでしょう。あなたはルート要素名を探しているなら調べる:

をテストされていません
$dom->documentElement->tagName; 

が、それはあなたがよりクリーンかつ明確な方法で探しているものをあなたに与える必要があります。

+0

これでテストされ、動作します!ありがとう!シンプルさのために "lonesomeday"の解決策の代わりにこれを選択します。 – guest86

+1

+1すばやく効果的な素晴らしいソリューションです。 – lonesomeday

0

よりむしろnullのテストが行​​われていない場合でも、「それはアトムだ」書きます返されたアイテムの数を確認してください:

$dom = new DOMDocument(); 
$dom->loadXML($resp); 
$feed = $dom->getElementsByTagName("feed"); 
if($feed->length != 0) { 
    echo 'it\'s a atom!'; 
} 
+1

フィードをテストして、それが無関係であるかどうかを確認することができます。 Javaから学んだ本能かもしれませんが、 "非オブジェクトのプロパティにアクセスしようとしました"という警告には耐えられません。 – cwallenpoole

+0

@cwallenpoole 'getElementsByTagName' *常に* DOMNodeListを返します。 [マニュアルを見る](http://php.net/manual/en/domdocument.getelementsbytagname.php)。 – lonesomeday

+0

あなたは知っている、私はそのnullを返す問題があったと思った。今私はそれについて考えている、おそらく長さが0だったと私は存在しないインデックスに対処しようとしました。 – cwallenpoole

2

$domのように見えるがDOMDocumentある - その場合には、私は何をしようとすると、以下の通りです:

$dom->loadXML($resp); 
if($dom->getElementsByTagName("feed")->length > 0 && $dom->getElementsByTagName("rss")->length <= 0){ 
    // atom feed 
}else{ 
    // rss feed 
} 

(私はのDOMDocumentを使用したことがない、ただdocumentationを読んで - これがあればごめんなさい間違った)

EDIT:

は自分の追加のコードを見た - それをwron wahtsはnullのためにチェックしています。 getElementsByTagNameは常にDOMNodeList(要素が見つからない場合は空の要素)を返します。

6

$ respが文字列かファイルパスかどうかはわかりませんが、ここでは私が行うことがあります。

$xml = simplexml_load_file($filepath); 
$root_element_name = $xml->getName(); 
if ($root_element_name == 'feed') { 
    // is atom feed 

} else if ($root_element_name == 'rss') { 
    // is rss feed 

} 

これでXMLがロードされ、ルートノードの名前が検索されます。ルートノードがfeedという名前の場合はatom、ルートノードがrssの場合はrssです。

+0

+1これはうまくいくので、私はOPでDOMDocumentをコード内の他の場所で使用していると考えています... – lonesomeday

+0

loadXMLの署名に基づいて推測します。実際のXMLの文字列。 – cwallenpoole

0

データを解析する方法と場所によって、application/atom+xmlのヘッダーを確認できます。また、strpos('http://www.w3.org/2005/Atom')を使用して確認することもできます。

関連する問題