2017-02-02 5 views
0

XML 및 관련 PHP에서 비 네임 스페이스 값을 가져 오는 것과 같은 방법으로 네임 스페이스 값을 얻는 방법은 무엇입니까? 나는 이것에 관해 많은 다른 SE QAs를 언급하고 있었지만, 올바르게 이해할 수는 없었다. 도움을 주시면 감사하겠습니다. :)네임 스페이스와 비 네임 스페이스 XML의 값을 얻는 방법

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" xmlns:psg="http://b3000.example.net:3000/psg_namespace/"> 
    <channel> 
    <title>Example</title> 
    <description>example stuff</description> 
    <item> 
     <psg:eventId>406589</psg:eventId> 
     <psg:duration>3482</psg:duration> 
    </item> 
    </channel> 
</rss> 

$xml = new SimpleXMLElement($source, null, true); 
foreach($xml->channel->item as $entry){ 
    echo $entry->title;   // This works 
    echo $entry->description; // This works 
    echo $entry->item->duration // Pseudo of what I need 
} 

재생 시간은 어떻게 되나요? 그것은 내가 실제로 찾고 있던 대답은 아니었지만 이와 같은 변화 나의 시도가

$namespaces = $item->getNameSpaces(true); 
$psg = $item->children($namespaces['psg']); 

업데이트

실패, 나는 내가 가지에 이르는 노력하고있어 첫 번째 대답을 받아 들여야 실제 문제 - "운영자 오류"! 이것은 작동하지 않습니다 ... 내 문제는 그것을 파악하려고 노력했다. 나는 echo print_r($psg, true)으로 디버깅을하고 있었다. 그 결과를 SimpleXmlObject로 보여주었습니다. 그런 다음 그 속성을 얻는 방법을 쫓아갔습니다. 그저 속성을 지정하는 대신에 속성을 지정하는 것뿐이었습니다. 이를 달성하기

foreach($xml->channel->item as $entry){ 
    $psg = $item->children($ns['psg']); 
    $title = (string) $item->title; 
    $duration = (string) $psg->duration; 
} 
+0

는 당신이, 당신이 네임 스페이스를 전달하고 접두사의 IT 말할 곳 http://php.net/manual/en/simplexmlelement.children.php에서 방법'children'를 사용하여 시도 되세요 그 노드에가? – Andy

+0

안녕하세요. 이 사이트의 컨벤션은 질문과 답변이 분리 된 상태로 유지된다는 것입니다. [그것이 자신의 질문에 대답하는 것을 의미한다고해도] (http://stackoverflow.com/help/self-answer). 그래서 당신이 추가 한 "업데이트"는 정말로 답이되어야합니다. 그러면 미래의 독자들에게 이것이 당신의 문제를 해결 한 것을 보여주기 위해 받아 들일 수 있습니다. Robbie Averill의 대답을 상향 조정하여 도움이되었다고 표시 할 수 있습니다. – IMSoP

답변

0

한 가지 방법은 XPath with namespaces의 조합을 사용하는 것입니다 : 문서에서 검색하고 추가 할 수 있습니다, 당신은 말 그대로 네임 스페이스를 선언하지 않으려면

$xml = new SimpleXMLElement($source, null, true); 
$xml->registerXPathNamespace('psg', 'http://b3000.example.net:3000/psg_namespace/'); 

foreach ($xml->xpath('//item/psg:duration') as $duration) { 
    echo $duration, PHP_EOL; 
} 

를/동적으로 :

foreach ($xml->getDocNamespaces() as $key => $namespace) { 
    $xml->registerXPathNamespace($key, $namespace); 
}