【问题标题】:PHP Webservice XML Output / Tag Element ValuePHP Webservice XML 输出/标签元素值
【发布时间】:2016-11-25 01:49:52
【问题描述】:

我正在使用网络服务编写代码,该服务几乎可以发送地址信息并使用巴西快递公司向我返回跟踪代码和发货信息。

代码是:

$url = "http://vpsrv.visualset.com.br/?wsdl";
$client = new SoapClient($url);


$parametrosVipp = new stdClass();

$parametrosVipp->PostagemVipp = new stdClass();

//webservice access data
$parametrosVipp->PostagemVipp->PerfilVipp = new stdClass();
$parametrosVipp->PostagemVipp->PerfilVipp->Usuario = "webservice";
$parametrosVipp->PostagemVipp->PerfilVipp->Token = "testewebservice";
$parametrosVipp->PostagemVipp->PerfilVipp->IdPerfil = "605";

//webservice address data
$parametrosVipp->PostagemVipp->Destinatario = new stdClass();
$parametrosVipp->PostagemVipp->Destinatario->CnpjCpf = "33323884845";
$parametrosVipp->PostagemVipp->Destinatario->Nome = "Rafael Ferreira";
$parametrosVipp->PostagemVipp->Destinatario->Endereco = "Al Americana";
$parametrosVipp->PostagemVipp->Destinatario->Numero = "156";
$parametrosVipp->PostagemVipp->Destinatario->Complemento = "casa";
$parametrosVipp->PostagemVipp->Destinatario->Bairro = "Jd Paulista";
$parametrosVipp->PostagemVipp->Destinatario->Cidade = "Vinhedo";
$parametrosVipp->PostagemVipp->Destinatario->UF = "SP";
$parametrosVipp->PostagemVipp->Destinatario->Cep = "13280000";

//store order number
$parametrosVipp->PostagemVipp->NotasFiscais = new stdClass();
$parametrosVipp->PostagemVipp->NotasFiscais->NotaFiscal = new stdClass();
$parametrosVipp->PostagemVipp->NotasFiscais->NotaFiscal->NrNotaFiscal = "11223344";

//package info
$parametrosVipp->PostagemVipp->Volumes = new stdClass();
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto = new stdClass();
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->Peso = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->Altura = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->Largura = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->Comprimento = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->CodigoBarraVolume = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->CodigoBarraCliente = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->ObservacaoVisual = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->Conteudo = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->AdicionaisVolume = "?";
$parametrosVipp->PostagemVipp->Volumes->VolumeObjeto->Etiqueta = "?";


$obj = new ObjectAndXML();

$retorno = $client->PostarObjeto($parametrosVipp);
$recordsXML = $obj->objToXML($retorno);

var_dump($recordsXML);

preg_match('#<Postagem>(.*?)</Postagem>#', $recordsXML, $match);

print_r($match);

所以当我调用 ->PostarObjeto 方法时,它会返回以下 XML:

<Postagem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
<ContratoEct>
<NrContrato>9912329784</NrContrato><CodigoAdministrativo>0013291092</CodigoAdministrativo><NrCartao>0067335344</NrCartao>
</ContratoEct>
<Destinatario>
<CnpjCpf>37323884845</CnpjCpf>
<IeRg/><Nome>Rafael Ferreira</Nome>
<Endereco>Al Americana</Endereco>
<Numero>156</Numero>
<Complemento>casa</Complemento>
<Bairro>Jd Paulista</Bairro>
<Cidade>Vinhedo</Cidade>
<UF>SP</UF>
<Cep>13280000</Cep>
<Telefone/><TelefoneSMS/><Email/>
</Destinatario>
<Servico>
<ServicoECT>41068</ServicoECT>
</Servico>
<NotasFiscais>
<NotaFiscal>
<DtNotaFiscal/><SerieNotaFiscal/><NrNotaFiscal>11223344</NrNotaFiscal><VlrTotalNota/>
</NotaFiscal></NotasFiscais>
<Volumes>
<VolumeObjeto>
<Peso>0</Peso>
<Cubagem>117</Cubagem>
<Altura>4</Altura>
<Largura>11</Largura>
<Comprimento>16</Comprimento>
<CodigoBarraVolume>?</CodigoBarraVolume>
<CodigoBarraCliente>?</CodigoBarraCliente>
<ObservacaoVisual>?</ObservacaoVisual>
<PosicaoVolume>1</PosicaoVolume>
<Conteudo>?</Conteudo>
<ValorDeclarado/>
<AdicionaisVolume>?</AdicionaisVolume><VlrACobrar/>
<Etiqueta>PZ000000822BR</Etiqueta>
<ValorTarifa>10.96</ValorTarifa
><ValorAdicionais>0.00</ValorAdicionais>
<ValorPostagem>10.96</ValorPostagem>
<StEntregaSabado>0</StEntregaSabado>
<StEntregaDomiciliar>1</StEntregaDomiciliar>
<DiasUteisPrazo>5</DiasUteisPrazo>
</VolumeObjeto>
</Volumes>
<ListaErros/>
<StatusPostagem>Valida</StatusPostagem>
</Postagem>

我需要获取标签&lt;Etiqueta&gt;PZ000000822BR&lt;/Etiqueta&gt; 之间的值。我尝试了在这里找到的大多数解决方案,例如 DOMElement、simplexml、REGEX,但没有成功。我可能做错了什么,但我无法弄清楚它是什么,因为我没有太多的网络服务经验。

谢谢大家,对糟糕的英语感到抱歉。

【问题讨论】:

    标签: php web-services xml-parsing


    【解决方案1】:

    假设您的 XML 为 $data,您可以执行以下操作:

    $data = '<Postagem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
    <ContratoEct>
    <NrContrato>9912329784</NrContrato><CodigoAdministrativo>0013291092</CodigoAdministrativo><NrCartao>0067335344</NrCartao>
    </ContratoEct>
    <Destinatario>
    <CnpjCpf>37323884845</CnpjCpf>
    <IeRg/><Nome>Rafael Ferreira</Nome>
    <Endereco>Al Americana</Endereco>
    <Numero>156</Numero>
    <Complemento>casa</Complemento>
    <Bairro>Jd Paulista</Bairro>
    <Cidade>Vinhedo</Cidade>
    <UF>SP</UF>
    <Cep>13280000</Cep>
    <Telefone/><TelefoneSMS/><Email/>
    </Destinatario>
    <Servico>
    <ServicoECT>41068</ServicoECT>
    </Servico>
    <NotasFiscais>
    <NotaFiscal>
    <DtNotaFiscal/><SerieNotaFiscal/><NrNotaFiscal>11223344</NrNotaFiscal><VlrTotalNota/>
    </NotaFiscal></NotasFiscais>
    <Volumes>
    <VolumeObjeto>
    <Peso>0</Peso>
    <Cubagem>117</Cubagem>
    <Altura>4</Altura>
    <Largura>11</Largura>
    <Comprimento>16</Comprimento>
    <CodigoBarraVolume>?</CodigoBarraVolume>
    <CodigoBarraCliente>?</CodigoBarraCliente>
    <ObservacaoVisual>?</ObservacaoVisual>
    <PosicaoVolume>1</PosicaoVolume>
    <Conteudo>?</Conteudo>
    <ValorDeclarado/>
    <AdicionaisVolume>?</AdicionaisVolume><VlrACobrar/>
    <Etiqueta>PZ000000822BR</Etiqueta>
    <ValorTarifa>10.96</ValorTarifa
    ><ValorAdicionais>0.00</ValorAdicionais>
    <ValorPostagem>10.96</ValorPostagem>
    <StEntregaSabado>0</StEntregaSabado>
    <StEntregaDomiciliar>1</StEntregaDomiciliar>
    <DiasUteisPrazo>5</DiasUteisPrazo>
    </VolumeObjeto>
    </Volumes>
    <ListaErros/>
    <StatusPostagem>Valida</StatusPostagem>
    </Postagem>';
    
    # add XML declaration to have a well-formed XML string
    $data = '<?xml version="1.0" encoding="UTF-8"?>' . $data;
    
    # load it as a SimpleXMLObject
    $xml_obj = simplexml_load_string($data);
    
    # select the desired element
    $etiqueta = $xml_obj->xpath('//Etiqueta');
    
    # get the string value
    $result = (string) $etiqueta[0];
    

    $result 会给你“PZ000000822BR”。

    【讨论】:

    • 得到错误:注意:试图在$etiqueta = $xml_obj-&gt;Volumes-&gt;VolumeObjeto-&gt;Etiqueta;线上获取非对象的属性
    • 我没有,但也许您的 XML 看起来与假设的输入不同。我编辑了我的答案,所以它使用了 XPath。看看它现在是否正常工作。