2011-09-02 6 views
1

xml 스트림에서 xpath 쿼리를 실행하고 데이터 집합을 검색 중입니다. 그 태그 이름을 찾아야합니다. 하지만 난 태그 이름을 검색 할 수있는 방법을 찾을 수 없습니다. XML 스트림은PHP에서 어린이 찾기 simplexml xpath

<Condition> 
      <Normal dataItemId="Xovertemp-06" timestamp="2011-09-02T03:35:34.535703Z" name="Xovertemp" sequence="24544" type="TEMPERATURE"/> 
      <Normal dataItemId="Xservo-06" timestamp="2011-09-02T03:35:34.535765Z" name="Xservo" sequence="24545" type="LOAD"/> 
      <Normal dataItemId="Xtravel-06" timestamp="2011-09-02T03:35:34.535639Z" name="Xtravel" sequence="24543" type="POSITION"/> 
</Condition> 

나는 내가 한 그래서

Temperature = Normal 
Load - Normal 

으로이 구문 분석 내가 따라와 오류

Fatal error: Call to a member function children() on a non-object in C:\xampp\htdocs\DataDumper\datadumper\test.php on line 53 

을 얻고있다

foreach ($xml->xpath("//n:Condition")->children("n") as $child) { 
    echo $child["type"] . "=" . $child->getName(); 
} 

되어 노력하고 있습니다 이제 내가 할 일이 있다는 것을 알았어. 방법은 내가 xpath 또는 무언가를 쿼리하고 나는 쿼리에 * 슬래시를 추가하는 등 다양한 조합을 시도했지만 매번 같은 오류가 발생했습니다.

답변

3

확실하지 시도 ... 또한 xpath()은 목록을 반환하므로 foreach 이상의 목록이 표시됩니다. $child의 하위 항목을 구문 분석하지 않으려면 하위 항목으로 액세스 할 필요가 없습니다. 거기에 의미가 있고, 예상대로 작동 할 것입니다.

foreach ($xml->xpath("/Condition/Normal") as $child) { 
    echo $child["type"] . "=" . $child->getName()."<br/>"; 
} 

출력

TEMPERATURE=Normal 
LOAD=Normal 
POSITION=Normal 
+0

업데이트되었습니다 @swordfish – Phil

+2

실제 xml은 네임 스페이스를 가지고 있기 때문에 여기에 추가했습니다. 또한 할 수 없어/조건/정상으로 정상적인 그것은 변경할 수 정적이지만, 나는 그것을/조건/* 변경 및 작동합니다! 감사 – swordfish

1

SimpleXMLElement::xpath()은 배열을 반환하고 SimpleXMLElement은 반환하지 않기 때문에 문제가 발생했습니다. 또한 XPath 쿼리의 네임 스페이스 지원에 대해서는 확신 할 수 없지만 실제로 해결할 수는 있습니다. 어쨌든 XML에 n 네임 스페이스가 없습니다.

실제로 대답은 XPath 쿼리와 일치하는 요소의 수에 따라 달라집니다. 당신이 (샘플 XML이 네임 스페이스되지 않음)

당신의 XPath에서

, 당신은 모든 condition/normal 태그가 아닌 condition를 선택해야 처음에 네임 스페이스 notaion을 사용하는 이유는 오직 하나의 경우,

$conditions = $xml->xpath('//Condition'); 
if (count($conditions) == 0) { 
    throw new Exception('No conditions found'); 
} 
$condition = $conditions[0]; 
foreach ($condition->children() as $child) { 
    printf('%s = %s', (string) $child['type'], $child->getName()); 
} 
+0

PLS 다시 나는 내가 OP는 자식 요소의 태그 이름을 알고하지 않은 인상이었다 내 대답 – swordfish

+0

을 편집 한 질문을 확인하는 경우 , 이것은 단지 '' 자식들에게만 적용됩니다 – Phil