2014-09-10 3 views
0

XML 파일 내에 XML이 포함되어 있습니다. 모든 것을 배열이나 객체로 파싱하는 방법은 무엇입니까?PHP는 XML 내에서 XML을 구문 분석합니다.

SimpleXMLElement Object 
(
    [ROW] => SimpleXMLElement Object 
     (
      [id] => 1 
      [message_id] => 123456789 
      [brand_name] => SAMPLE 
      [request_xml] => SimpleXMLElement Object 
       (
        ... 
        [LogMessage] => 
        ... 
        [from] => [email protected] 
        ... 
       ) 

      [http_status] => 400 
      [created_by] => admin 
      [created_on] => 2014-09-08 01:56:59 
     ) 
) 

내가 내 예에서 request_xml의 모든 수준을 넣어하지 않은,하지만 당신은 아이디어를 얻을 :

<DATA> 
    <ROW> 
     <id>1</id> 
     <message_id>123456789</message_id> 
     <brand_name>SAMPLE</brand_name> 
     <request_xml> 
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
&lt;Email&gt; 
&lt;Service&gt; 
&lt;LogMessage/&gt; 
&lt;Delivery&gt; 
&lt;Synchronous/&gt; 
&lt;/Delivery&gt; 
&lt;/Service&gt; 
&lt;Model&gt; 
&lt;Head&gt; 
&lt;From&gt;[email protected] &lt;/From&gt; 
&lt;To&gt;[email protected]&lt;/To&gt; 
&lt;Subject&gt;Your Question&lt;/Subject&gt; 
&lt;/Head&gt; 
&lt;ns2:ContactUs&gt; 
&lt;ns2:Sender&gt; 
&lt;ns2:FirstName&gt;John&lt;/ns2:FirstName&gt; 
&lt;/ns2:Sender&gt; 
&lt;/ns2:ContactUs&gt; 
&lt;/Model&gt; 
&lt;InlineImages/&gt; 
&lt;History/&gt; 
&lt;/Email&gt; 
     </request_xml> 
     <http_status>400</http_status> 
     <created_by>admin</created_by> 
     <created_on>2014-09-08 01:56:59</created_on> 
    </ROW> 
</DATA> 

내 목표는 같은 뭔가를해야만로 끝날 것입니다. 기본적으로 XML 파일의 나머지 부분처럼 request_xml을 파싱해야합니다.

어떻게하면됩니까? 이것에 대한 도움을 미리 감사드립니다!

+1

왜 그냥 SimpleXML을로 그 구문 분석, SimpleXML을, 추출 문자열의 주요 문자열을 구문 분석하고 주요 XML에 노드로 하위 XML을 추가? – ToBe

+0

인코딩은 어떻게 처리합니까? – MrUpsidown

+1

특정 엔티티 집합과 함께'html_entity_decode' 또는'str_replace'를 사용할 수 있습니다. – ToBe

답변

2

노드 값 request_xml 요소 노드를 읽으면 결과에 엔티티가 디코딩됩니다.

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

$innerXml = $xpath->evaluate('string(/DATA/ROW/request_xml)'); 
echo $innerXml; 

출력 :

<?xml version="1.0" encoding="UTF-8"?> 
<Email> 
<Service> 
<LogMessage/> 
... 

당신은 별도의 문서 객체로 내부 XML을로드 할 수 있습니다.

$inner = new DOMDocument(); 
$inner->loadXml(trim($innerXml)); 
echo $inner->saveXml(); 

그러나 예제에서는 내부 XML이 손상되었습니다. ns2 접두어에 대한 네임 스페이스 정의가 누락되었습니다. 추가 한 경우이 작동합니다

데모 : https://eval.in/191279

+0

답변 해 주셔서 감사합니다. 내 질문에 네임 스페이스 정의를 생략했지만 실제로 거기에 있습니다. 그러나 어떤 이유로 'simplexml_load_string()'이이 ns2 태그를 분석하지 못합니다. 하지만 큰 문제는 아닙니다. 내가 정말로 신경 써야 할 것은 필드의 내용이다. 그래서 파싱하기 전에 태그에서 빠른'str_replace'를 할 수있다. – MrUpsidown

+0

SimpleXML 네임 스페이스 처리는 다소 복잡합니다. SimpleXMLElement :: registerXpathNamespace()를 사용하여 자신의 접두사를 등록하고 xpath()와 함께 사용할 수 있으며 일부 메서드는 네임 스페이스를 인식합니다. 그러나 그 요소에 대해서만 유효합니다. 다시 등록해야하는 자식 요소에 대해서만 유효합니다. DOM은 Xpath에 대해 별도의 객체를 사용하므로 한 번만 등록해야합니다. http://stackoverflow.com/a/25571382/2265374 – ThW

+0

정보를 제공해 주셔서 감사합니다. – MrUpsidown

관련 문제