2011-01-03 3 views
2

주어진 xml이 "atom"또는 "rss"형식인지 확인해야하는 PHP 코드를 작성하고 있습니다. 원자 및 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; 

,하지만 당신은 훨씬 깨끗하고 명확한 방법으로 찾고있는 무엇을 제공해야합니다. -이 경우 미안 해요

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

(내가 사용한 적이있는 DOMDocument 단지 documentation 읽기 : - $domDOMDocument처럼

+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

피드가 null인지 여부를 확인하기 위해 피드를 테스트 할 수 있습니다. 아마도 그것은 자바에서 배운 본능이지만, 나는 "비 객체의 속성에 접근하려고 시도했다"라는 경고를 견딜 수 없다. – cwallenpoole

+0

@cwallenpoole'getElementsByTagName' * 항상 * DOMNodeList를 반환합니다. [매뉴얼 참조] (http://php.net/manual/en/domdocument.getelementsbytagname.php). – lonesomeday

+0

알다시피, 나는 null을 돌려주는 문제가 있다고 생각했습니다. 이제는 생각하고 있습니다. 아마 길이가 0이고 아마도 존재하지 않는 색인을 처리하려고 시도했을 것입니다. – cwallenpoole

2

이 보이는 경우, 내가 뭘하려고 할 것은 다음과 같다) 잘못된

는 편집 : - 그것은 null 확인되어 함께 wron을 wahts

은 당신의 추가 코드가 보았다. 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이 효과가 있기 때문에 +1하지만, OP가 DOMDocument를 코드의 다른 곳에서 사용하고 있다고 가정합니다. Atom/RSS 피드를 사용하고 있다고 가정하면 ... – lonesomeday

+0

loadXML의 서명을 기반으로합니다. 실제 XML의 문자열. – cwallenpoole

0

데이터를 구문 분석하는 방법/위치에 따라 application/atom+xml의 헤더를 확인할 수 있습니다. 또는 strpos('http://www.w3.org/2005/Atom')을 사용하여 확인할 수도 있습니다.

관련 문제