복붙노트

SimpleXML을 사용하여 네임 스페이스로 XML 구문 분석

PHP

SimpleXML을 사용하여 네임 스페이스로 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. ==============================

    1.

    그것은 xpath 쿼리에서 registerXPathNamespace와 전체 네임 스페이스 접두사없이 작동합니다 :

    $xml = new SimpleXMLElement($r);
    
    foreach($xml->xpath('//event:event') as $event) {
     var_export($event->xpath('event:sessionKey'));
    }
    
  2. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    7.

    나는 틀릴 수도 있지만 SimpleXMLElement를 사용하여 SOAP 같은 콜론 심볼이있는 XML을 올바르게 구문 분석 할 수 있다고 생각하지 않습니다.

    이 일을 좀 더 우아한 방법이있을 것이라고 확신하지만 일반적으로 file_get_contents ()를 사용하여 파일 내용을 변수로 읽은 다음 콜론을 대체 / 제거한 다음 SimpleXMLElement로 보냅니다.

  8. from https://stackoverflow.com/questions/595946/parse-xml-with-namespace-using-simplexml by cc-by-sa and MIT lisence