web服务-PHP web服务XML输出/标记元素值


web services - PHP Webservice XML Output / Tag Element Value

我正在使用一个Web服务写下一个代码,该服务几乎会发送地址信息,并使用巴西快递公司向我返回跟踪代码和发货信息。

代码为:

$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>

我需要得到标签<Etiqueta>PZ000000822BR</Etiqueta>之间的值。我尝试了在这里找到的大多数解决方案,如DOMElement、simplexml、REGEX,但都没有成功。我可能做错了什么,但我不知道是什么,因为我对网络服务没有太多经验。

谢谢大家,对英语不好感到抱歉。

假设您的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"。