2008-10-11 3 views
1

저는 PHP로 XML 조작을 시작했습니다. 나는 예상치 못한 것을 발견했습니다. 여기에 내가 테스트 입력으로 사용하고있어 XML이있다 :PHP DOM : 오히려 초보자 용 질문

<list> 
    <activity1> running </activity1> 
    <activity2> swimming </activity2> 
    <activity3> soccer </activity3> 
</list> 

를 자, 내가 기대 한 것이 PHP 코드 것 출력 'activity1에'

$xmldoc = new DOMDocument(); 
$xmldoc->load('file.xml'); 

//the line below would make $root the <list> node 
$root = $xmldoc->firstChild; 

//the line below would make $cnode the first child 
//of the <list> node, which is <activity1> 
$cnode = $root->firstChild; 

//this should output 'activity1' 
echo 'element name: ' . $cnode->nodeName; 

대신,이 코드를 출력하는 #text. 나는 노드 이름을 인쇄하기 전에, 코드의 새로운 라인을 삽입하여 그것을 고칠 수 :

$cnode = $cnode->nextSibling; 

지금, 나는이 인쇄 대신 'activity2에'에 'activity1에'를 인쇄하는 것을 기대했을 것이다. 무슨 일 이니?

답변

1

노드 개회리스트 태그와 태그 사이 activity1에 (이 경우에 공백) 텍스트이며, 다음 노드는 activity1에 요소이다. 요소는 노드와 동일하지 않습니다. 공백 전용 노드를 제거하면 방해가되지 않는 :

+0

나는 지금 무슨 일이 일어나고 있는지 잘 알고 있다고 생각합니다. 감사 –

1

예상 동작을 얻으려면, 당신은() Czimi의 대답에 참고

<?php 
$xmldoc = new DOMDocument(); 
$xmldoc->load('file.xml', LIBXML_NOBLANKS); 
?> 
0

를 호출 부하의 두 번째 매개 변수로 LIBXML_NOBLANKS에 전달해야 노드의 유형 (요소, 텍스트 노드, 주석인지 여부)을 확인해야합니다. 일반적으로 요소 노드 만 선택하는 데 관심이 있다면 다음과 같이하면 좋을 것입니다 :

while($nodeInQuestion->nodeType != 1 && $nodeInQuestion->nextSibling) { 
    $nodeInQuestion = $nodeInQuestion->nextSibling; 
} 

이것은 일종의 의사 코드입니다. 분명히 엘리먼트를 찾고 parentNode의 childNodes의 끝에 도달하면 어떻게 든 실패를 처리해야합니다.

1

XPath를 사용하여 문서를 쿼리하는 경우 이러한 종류의 아크라나에 대해 걱정할 필요가 없습니다. DOMDocument::xpath_eval()을 사용하여 /list/* 패턴을 평가하면 무엇이든 최상위 레벨 list 요소의 하위 요소 만 반환됩니다.