php loadXML 字符串

php loadXML string

我有一个 xsd 字符串,我需要获取标签状态和标签 itens/seloRecebimento 中的内容并将其放置为 table.

我需要的:

$status = 0; // or 1

itens/seloRecebimento 上的标签内容如下:

  1. 4 AAA034593 A1B2
  2. 4 AAA034594 A1B2

下面是 xsd 字符串:

$string = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
  <ns4:receberSelosResponse xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://www.tjce.jus.br/selodigital/schemas" xmlns:ns4="http://service.recebimento.selodigital.tjce.jus.br/">
     <return>
        <cabecalho>
           <versao>1.12</versao>
           <dataHora>2019-12-30T08:17:17.425-03:00</dataHora>
           <ambiente>2</ambiente>
           <serventia>
              <codigoServentia>000309</codigoServentia>
           </serventia>
        </cabecalho>
        <itens>
           <itemSolicitacao>
              <sequencial>1</sequencial>
              <status>
                 <codigo>MSG037</codigo>
                 <status>0</status>
                 <mensagem>Item da solicitação já foi entregue para serventia.</mensagem>
              </status>
              <seloRecebimento>
                 <codigoSelo>
                    <codigo>4</codigo>
                 </codigoSelo>
                 <numeroSerie>AAA034593</numeroSerie>
                 <validador>A1B2</validador>
              </seloRecebimento>
              <seloRecebimento>
                 <codigoSelo>
                    <codigo>4</codigo>
                 </codigoSelo>
                 <numeroSerie>AAA034594</numeroSerie>
                 <validador>A1B2</validador>
              </seloRecebimento>                 
           </itemSolicitacao>
        </itens>
     </return>
  </ns4:receberSelosResponse>
</soap:Body>
</soap:Envelope>';

到目前为止我做了什么:

$domDocument = new DOMDocument();
$domDocument->loadXML($string);
$selos = array();
$selos_r = $domDocument->getElementsByTagName("itens");
foreach($selos_r as $selos_rs){
    foreach($selos_rs->childNodes as $valor)    {
        if($valor instanceof DOMElement)        {
            array_push($selos, $valor->textContent);
        }
    }
}

print_r($selos);

结果:

Array ( [0] => 1 MSG037 0 Item da solicitação já foi entregue para serventia. 4 AAA034593 A1B2 4 AAA034594 A1B2 ) 

目前,您只是转储了所有 DOMElement 内容。此代码使用 XPath 挑选出您想要的位并将它们放入数组中。

每个 XPath 从您作为上下文使用的当前元素开始,并使用 descendant:: 确保它获取元素内的数据。还使用 evaluate() 因为这可以 return 字符串值...

$domDocument = new DOMDocument();
$domDocument->loadXML($string);
$xp = new DOMXPath($domDocument);

$selos = array();
$selos_r = $domDocument->getElementsByTagName("itens");
foreach($selos_r as $selos_rs){
    $status = $xp->evaluate('string(descendant::status/status)', $selos_rs);
    foreach($selos_rs->getElementsByTagName("seloRecebimento") as $s)    {
        $codigo = $xp->evaluate('string(descendant::codigo)', $s);
        $numeroSerie = $xp->evaluate('string(descendant::numeroSerie)', $s);
        $validador = $xp->evaluate('string(descendant::validador)', $s);
        $selos[] = [$status, $codigo, $numeroSerie, $validador];
    }
}

print_r($selos);