SimpleXML을 사용하여 네임 스페이스로 XML 구문 분석
PHPSimpleXML을 사용하여 네임 스페이스로 XML 구문 분석
나는 이것을 xml로 갖는다 :
<root xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
<event:event>
<event:sessionKey></event:sessionKey>
<event:sessionName>Learn QB in Minutes</event:sessionName>
<event:sessionType>9</event:sessionType>
<event:hostWebExID></event:hostWebExID>
<event:startDate>02/12/2009</event:startDate>
<event:endDate>02/12/2009</event:endDate>
<event:timeZoneID>11</event:timeZoneID>
<event:duration>30</event:duration>
<event:description></event:description>
<event:status>NOT_INPROGRESS</event:status>
<event:panelists></event:panelists>
<event:listStatus>PUBLIC</event:listStatus>
</event:event>
...
</root>
어떻게 모든 이벤트를 루프 할 수 있습니까? 예를 들어 이벤트 노드를 표시하고 모든 이벤트를 표시 할 수 있습니다 : SessionKey?
작동하지 않습니다.
$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
foreach($xml->xpath('//e:event') as $event) {
var_export($event->xpath('//e:sessionKey'));
}
해결법
-
==============================
1.
그것은 xpath 쿼리에서 registerXPathNamespace와 전체 네임 스페이스 접두사없이 작동합니다 :
$xml = new SimpleXMLElement($r); foreach($xml->xpath('//event:event') as $event) { var_export($event->xpath('event:sessionKey')); }
-
==============================
2.
사용하는 각 simpleXMLElement 객체에 대한 네임 스페이스를 등록해야합니다.
$xml = new SimpleXMLElement($r); $xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event'); foreach($xml->xpath('//e:event') as $event) { $event->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event'); var_export($event->xpath('//e:sessionKey')); }
네임 스페이스는 xml 파일의 어딘가에서 선언되어야합니다.
<event:event xmlns:event="http://www.webex.com/schemas/2002/06/service/event"> ...
설명 된 도끼도 작동합니다. xml 파일이 항상 같은 접두사를 사용한다는 것을 알고 있으면 registerXPathNamespace를 건너 뛸 수 있습니다.
-
==============================
3.
여기 나를 위해 일한 대안.
$xml = simplexml_load_string($r); $ns = $xml->getNamespaces(true); foreach ($xml->children($ns['event'])->event as $skey) { $sessionKey = $skey->children($ns['event'])->sessionKey; echo $sessionKey; }
-
==============================
4.
또 다른 방법은 SimpleXML을 구문 분석에 사용하고 DOMDocument를 조작 / 액세스 용으로 사용하는 것입니다.이 방법은 네임 스페이스 문제를 모두 무시합니다.
$xml = new SimpleXMLElement($r); $xml = dom_import_simplexml($xml); $nodelist= $xml->getElementsByTagName('event'); for($i = 0; $i < $nodelist->length; $i++) { $sessions = $nodelist->item($i)->getElementsByTagName('sessionKey'); echo $sessions->item(0)->nodeValue; }
-
==============================
5.
simplexml로 많은 작업을했기 때문에 이것이 내가하는 방법입니다.
이미 요소가 있고 다른 네임 스페이스의 자식을 얻고 싶다면 다음과 같은 구조에 대해 말하면서 마술 트릭을 만들 수 있습니다.
<entry> <title type="text">My test entry</title> <gd:when startTime="2017-02-26T02:00:00Z" endTime="2017-02-26T03:00:00Z"/> <gc:notes type="string">A type</gc:notes> </entry>
자식 함수에 두 번째 매개 변수로 true를 보내는 것입니다.
$title = (string) $entry->title; $gd = $entry->children('gd', TRUE); $attrs = $gd->when->attributes(); $startTime = (string) $attrs->startTime; $gc = $entry->children('gc', TRUE); $notes = (string) $gc->notes();
-
==============================
6.
registerXPathNamespace를 사용하고 xpath를 호출하면 실제로 작동하지 않습니다. 나는이 위대한 게시물에 제공된 솔루션으로 가야만했다 : http://blog.preinheimer.com/index.php?/archives/172-SimpleXML,-Namespaces-Hair-loss.html
그래서 귀하의 경우, 이것은 :
echo $xml->children('http://www.webex.com/schemas/2002/06/service/event')->sessionName;
출력 :
-
==============================
7.
나는 틀릴 수도 있지만 SimpleXMLElement를 사용하여 SOAP 같은 콜론 심볼이있는 XML을 올바르게 구문 분석 할 수 있다고 생각하지 않습니다.
이 일을 좀 더 우아한 방법이있을 것이라고 확신하지만 일반적으로 file_get_contents ()를 사용하여 파일 내용을 변수로 읽은 다음 콜론을 대체 / 제거한 다음 SimpleXMLElement로 보냅니다.
from https://stackoverflow.com/questions/595946/parse-xml-with-namespace-using-simplexml by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PDO Prepared 단일 쿼리에서 여러 행을 삽입합니다. (0) | 2018.09.04 |
---|---|
PHP에서 HTML / XML을 구문 분석하고 처리하는 방법은 무엇입니까? (0) | 2018.09.04 |
PHP로 다차원 배열 변환하기 (0) | 2018.09.04 |
PHP - 디버깅 컬 (0) | 2018.09.04 |
정수와 같은 이름을 가진 객체 속성에 액세스하는 방법? (0) | 2018.09.04 |