2017-01-05 2 views
0

XML에서 일부 데이터를 추출하고 싶습니다. 나는이 PHP 코드xml에서 텍스트 노드를 가져 오는 방법

$xml = simplexml_load_string($xmlString); 
$json = json_encode($xml); 
$obj = json_decode($json); 
print_r($obj); 

을 실행

<root> 
    <p>Some text</p> 
    <p>Even more text</p> 
    <span class="bla bla"> 
     <span class="currency">EUR</span> 19.95 
    </span> 
</root> 

하고 그 결과는 다음과 같습니다 :

나는이 XML을

stdClass Object 
(
    [p] => Array 
     (
      [0] => Some text 
      [1] => Even more text 
     ) 

    [span] => stdClass Object 
     (
      [@attributes] => stdClass Object 
       (
        [class] => bla bla 
       ) 

      [span] => EUR 
     ) 
) 

내가 누락 된 문자열을 얻는 방법 " 19.95 "?

답변

0

XML을 JSON/배열로 변환하지 마십시오. 그것은 당신이 느슨한 정보와 특징을 의미합니다.

SimpleXML은 기본 XML과 함께 작동하지만 혼합 노드와 같은 문제가 있습니다. 이 경우 DOM을 사용하면보다 쉽게 ​​처리 할 수 ​​있습니다.

$xml = <<<'XML' 
<root> 
    <p>Some text</p> 
    <p>Even more text</p> 
    <span class="bla bla"> 
     <span class="currency">EUR</span> 19.95 
    </span> 
</root> 
XML; 

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach($xpath->evaluate('/root/span[@class="bla bla"]') as $span) { 
    var_dump(
    $xpath->evaluate('string(span[@class="currency"][1])', $span), 
    $xpath->evaluate(
     'number(span[@class="currency"][1]/following-sibling::text()[1])', 
     $span 
    ) 
); 
} 

Xpath는 DOM (XML 용 Think SQL)의 일부를 가져 오는 표현식 언어입니다. PHP에는 여러 가지 방법으로 액세스 할 수 있습니다. SimpleXMLElement::xpath()은 노드를 SimpleXMLElement 객체의 배열로 가져올 수 있습니다. DOMXpath::query()을 사용하면 노드 목록을 가져올 수 있습니다. DOMXpath::evaluate()만이 노드 목록과 스칼라 값을 가져올 수 있습니다.

예제에서 /root/span[@class="bla bla"]은 주어진 클래스 속성을 갖는 모든 span 요소 노드를 반입합니다. 각 노드에 대해 클래스 통화를 문자열로 사용하여 span을 가져옵니다. 세 번째 표현식은 currency 범위의 첫 번째 다음 형제 텍스트 노드를 숫자로 가져옵니다.

+0

XPath에는 몇 가지 유용한 트릭이 포함되어 있지만 설명 된 작업에는 지나치게 과장됩니다. SimpleXML은'print_r'의 불완전한 출력을 제외하면이 XML에 전혀 문제가 없습니다. – IMSoP

0

디버그 출력을 신뢰하지 말고 JSON 또는 배열로 변환하지 말고 문제를 지나치게 생각하지 마십시오.

echo $xml->span; 

또는 변수에 그것을 얻기 위해 명시 적으로 문자열로 캐스팅 :

$foo = (string)$xml->span 

을 또는 당신이 원하는 경우이 문자열을 출력하기

는 요소로 이동하고 울리는 것만 큼 간단합니다 ThW의 대답처럼 XPath를 사용하려면 //span[@class="bla bla"]을 사용하여 범위를 찾을 수 있습니다 (->xpath()은 배열을 반환하므로 배열의 요소 0을 원하므로)

echo $xml->xpath('//span[@class="bla bla"]')[0];