2017-12-20 3 views
0

하지 않고있는 DOMDocument에 XML 문자열을 추가하고 soap:Body 태그 내부에 XML 메시지를 포함하는 SOAP (1.1, 문서/리터럴) 요청을 구축해야합니다.은 어떻게 PHP를 사용하고 네임 스페이스

내 첫 번째 문제는 전에이 "프로토콜"을 사용하지 않았다는 것입니다.

내 XML 메시지가 매우 복잡하므로 별도로 빌드하려면 SimpleXMLElement 클래스를 사용하고 있습니다. SOAP 메시지를 작성하려면 두 개의 XML 문자열이 있습니다.

1- SOAP 구조입니다.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
    <soap:Header></soap:Header> 
    <soap:Body>...</soap:Body> 
</soap:Envelope> 

2 내 사용자 정의 XML 문자열

<eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/v2_2_02" grupo="1"> 
    <envioLoteEventos> 
    <ideEmpregador tpInsc="1" nrInsc="0000000012"/> 
    <ideTransmissor tpInsc="1" nrInsc="0000000012"/> 
    <eventos> 
     <eSocial xmlns="http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02"> 
     <evtInfoEmpregador Id="8515">...</evtInfoEmpregador> 
     </eSocial> 
    </eventos> 
    </envioLoteEventos> 
</eSocial> 
  • 내가 필요한 것 : 두 번째 문자열 soap:Body 태그 안에 정확히 그대로.
  • 내가 얻는 것 :DOMDocument에 의해 자동 추가 된 soap:Body 내부의 두 번째 문자열 soap:Body. 내가 사용

알고리즘 (안 전체 코드) :

$soapBodyElement = new SimpleXMLElement($soapBodyString); 
$customMessageElement = new SimpleXMLElement($customMessageString); 
// Some operations... 
$domParent = dom_import_simplexml($soapBodyElement); 
$domChild = dom_import_simplexml($customMessageElement); 
$domDocument = $domParent->ownerDocument->importNode($domChild, true); 
$domParent->appendChild($domDocument); 

echo $domParent->ownerDocument->saveXML(); 

출력 : (? 네임 스페이스) 솔직히

<soap:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> 
    <soap:Header/> 
    <soap:Body> 
    <eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/v2_2_02" xmlns:default="http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02" xmlns:default1="http://www.w3.org/2000/09/xmldsig#" grupo="1"> 
     <envioLoteEventos> 
     <ideEmpregador tpInsc="1" nrInsc="0000000012"/> 
     <ideTransmissor tpInsc="1" nrInsc="0000000012"/> 
     <eventos> 
      <default:eSocial xmlns="http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02"> 
      <default:evtInfoEmpregador Id="2550">...</default:evtInfoEmpregador> 
      </default:eSocial> 
     </eventos> 
     </envioLoteEventos> 
    </eSocial>  
    </soap:Body> 
</soap:Envelope> 

, 나는 왜 default 접두사를 모른다 가 추가되었습니다.

이 자동 동작없이 두 개의 XML 문자열을 추가하려면 어떻게해야합니까?

+0

DOMDocument를 사용하여 처음부터 XML 파일을 만들려고 했습니까? – DanielO

답변

1

Marshal XML Serializer을 사용하면 DOMDocument와 SimpleXML을 사용하는 것이 훨씬 쉽습니다.

SoapEnvelopeMapper.php

use KingsonDe\Marshal\AbstractXmlMapper; 

class SoapEnvelopeMapper extends AbstractXmlMapper { 

    /** 
    * @var AbstractXmlMapper 
    */ 
    private $messageMapper; 

    public function __construct(AbstractXmlMapper $messageMapper) { 
     $this->messageMapper = $messageMapper; 
    } 

    public function map($data) { 
     return [ 
      'soap:Envelope' => [ 
       $this->attributes() => [ 
        'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 
        'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema', 
        'xmlns:soap' => 'http://www.w3.org/2003/05/soap-envelope', 
       ], 
       'soap:Header' => null, 
       'soap:Body' => $this->item($this->messageMapper, $data), 
      ] 
     ]; 
    } 
} 

SoapMessageMapper.php

use KingsonDe\Marshal\AbstractXmlMapper; 

class SoapMessageMapper extends AbstractXmlMapper { 

    public function map($data) { 
     return [ 
      'eSocial' => [ 
       $this->attributes() => [ 
        'xmlns'   => 'http://www.esocial.gov.br/schema/lote/eventos/envio/v2_2_02', 
        'xmlns:default' => 'http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02', 
        'xmlns:default1' => 'http://www.w3.org/2000/09/xmldsig#', 
        'grupo'   => 1, 
       ], 
       'envioLoteEventos' => [ 
        'ideEmpregador' => [ 
         $this->attributes() => [ 
          'tpInsc' => 1, 
          'nrInsc' => '0000000012', 
         ], 
        ], 
        'ideTransmissor' => [ 
         $this->attributes() => [ 
          'tpInsc' => 1, 
          'nrInsc' => '0000000012', 
         ], 
        ], 
       ], 
       'eventos' => [ 
        'eSocial' => [ 
         $this->attributes() => [ 
          'xmlns' => 'http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02', 
         ], 
         'evtInfoEmpregador' => [ 
          $this->attributes() => [ 
           'Id' => 2550, 
          ], 
          $this->data() => '...', 
         ], 
        ], 
       ], 
      ] 
     ]; 
    } 
} 

SoapResponse.php

을 :

그런 다음 당신은 다음을 수행 할 수

$data = new \stdClass(); 

$messageMapper = new SoapMessageMapper(); 
$envelopeMapper = new SoapEnvelopeMapper($messageMapper); 

$xml = MarshalXml::serializeItem($envelopeMapper, $data); 
+0

아,이 프로젝트를 알지 못했고 데이터 구조를 XML 문자열로 변환하기 위해 자체 라이브러리를 만들었습니다 (SimpleXMLElement 사용). 내 lib의 문제는 자식 요소를 추가 한 다음 상대 속성을 추가 한 후 다음 행에 추가되는 "soap : Envelope"요소가 네임 스페이스없이 작성되어 "SimpleXMLElement"라는 오류 메시지를 표시한다는 것입니다.).어쨌든 marshal-xml-serializer를 살펴 보겠습니다. –

+0

프로젝트는 아주 새로운 것입니다 : 그것은'DOMDocument'를 사용하여'SimpleXML'의 한계를 뛰어 넘지 않습니다. 너가 좋아하길 바래. 모든 의견, 제안을 환영합니다! – Kingson