Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jokimen

simplexml_load_file

Mensagens Recomendadas

jokimen

Bom dia Pessoal,

Estou com um trabalho em PHP por terminar, pois estou com dificuldades em ler um XML e guardar todos

os dados em variáveis e Arrays.

Alguém me pode ajudar?

Coloco em anexo o File XML. Obrigado desde já.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03">

<CstmrPmtStsRpt>

<GrpHdr>

<MsgId>MG/20150421/00359</MsgId>

<CreDtTm>2015-04-21T09:12:41</CreDtTm>

</GrpHdr>

<OrgnlGrpInfAndSts>

<OrgnlMsgId>73730</OrgnlMsgId>

<OrgnlMsgNmId>PAIN.001.001.03</OrgnlMsgNmId>

<OrgnlNbOfTxs>27</OrgnlNbOfTxs>

<OrgnlCtrlSum>278258.10</OrgnlCtrlSum>

<StsRsnInf>

<Rsn>

<Prtry>M000</Prtry>

</Rsn>

</StsRsnInf>

</OrgnlGrpInfAndSts>

<OrgnlPmtInfAndSts>

<OrgnlPmtInfId>73730-001</OrgnlPmtInfId>

<OrgnlNbOfTxs>27</OrgnlNbOfTxs>

<OrgnlCtrlSum>278258.10</OrgnlCtrlSum>

<StsRsnInf>

<Rsn>

<Prtry>L000</Prtry>

</Rsn>

</StsRsnInf>

<TxInfAndSts>

<StsId>301</StsId>

<OrgnlEndToEndId>10859415</OrgnlEndToEndId>

<StsRsnInf>

<Rsn>

<Cd>0000</Cd>

</Rsn>

</StsRsnInf>

<OrgnlTxRef>

<Amt>

<InstdAmt Ccy="EUR">12345.00</InstdAmt>

</Amt>

<ReqdColltnDt>2015-04-20</ReqdColltnDt>

<PmtTpInf>

<SeqTp></SeqTp>

</PmtTpInf>

<PmtMtd>TRF</PmtMtd>

<Dbtr>

<Nm>NOME ORDENANTE.</Nm>

</Dbtr>

<DbtrAcct>

<Id>

<IBAN>PT50003601239910123456789</IBAN>

</Id>

</DbtrAcct>

<DbtrAgt>

<FinInstnId>

<BIC>MPIOPTPL</BIC>

</FinInstnId>

</DbtrAgt>

<CdtrAgt>

<FinInstnId>

<BIC>BCOMPTPL</BIC>

</FinInstnId>

</CdtrAgt>

<Cdtr>

<Nm>NOME DESTINATÁRIO</Nm>

</Cdtr>

<CdtrAcct>

<Id>

<IBAN>PT50003300004567890123456</IBAN>

</Id>

</CdtrAcct>

</OrgnlTxRef>

</TxInfAndSts>

<TxInfAndSts>

<StsId>301</StsId>

<OrgnlEndToEndId>10859415</OrgnlEndToEndId>

<StsRsnInf>

<Rsn>

<Cd>0000</Cd>

</Rsn>

</StsRsnInf>

<OrgnlTxRef>

<Amt>

<InstdAmt Ccy="EUR">12345.00</InstdAmt>

</Amt>

<ReqdColltnDt>2015-04-20</ReqdColltnDt>

<PmtTpInf>

<SeqTp></SeqTp>

</PmtTpInf>

<PmtMtd>TRF</PmtMtd>

<Dbtr>

<Nm>NOME ORDENANTE.</Nm>

</Dbtr>

<DbtrAcct>

<Id>

<IBAN>PT50003601239910123456789</IBAN>

</Id>

</DbtrAcct>

<DbtrAgt>

<FinInstnId>

<BIC>MPIOPTPL</BIC>

</FinInstnId>

</DbtrAgt>

<CdtrAgt>

<FinInstnId>

<BIC>BCOMPTPL</BIC>

</FinInstnId>

</CdtrAgt>

<Cdtr>

<Nm>NOME DESTINATÁRIO</Nm>

</Cdtr>

<CdtrAcct>

<Id>

<IBAN>PT50003300004567890123456</IBAN>

</Id>

</CdtrAcct>

</OrgnlTxRef>

</TxInfAndSts>

<TxInfAndSts>

<StsId>301</StsId>

<OrgnlEndToEndId>10859415</OrgnlEndToEndId>

<StsRsnInf>

<Rsn>

<Cd>0000</Cd>

</Rsn>

</StsRsnInf>

<OrgnlTxRef>

<Amt>

<InstdAmt Ccy="EUR">12345.00</InstdAmt>

</Amt>

<ReqdColltnDt>2015-04-20</ReqdColltnDt>

<PmtTpInf>

<SeqTp></SeqTp>

</PmtTpInf>

<PmtMtd>TRF</PmtMtd>

<Dbtr>

<Nm>NOME ORDENANTE.</Nm>

</Dbtr>

<DbtrAcct>

<Id>

<IBAN>PT50003601239910123456789</IBAN>

</Id>

</DbtrAcct>

<DbtrAgt>

<FinInstnId>

<BIC>MPIOPTPL</BIC>

</FinInstnId>

</DbtrAgt>

<CdtrAgt>

<FinInstnId>

<BIC>BCOMPTPL</BIC>

</FinInstnId>

</CdtrAgt>

<Cdtr>

<Nm>NOME DESTINATÁRIO</Nm>

</Cdtr>

<CdtrAcct>

<Id>

<IBAN>PT50003300004567890123456</IBAN>

</Id>

</CdtrAcct>

</OrgnlTxRef>

</TxInfAndSts>

</OrgnlPmtInfAndSts>

</CstmrPmtStsRpt>

</Document>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jokimen

Qual o problema? O proprio titulo do topico criado por ti indica o que necessitas de fazer

Boas Happy,

Certo eu criei este script

<?php

$dadosQueSeRepetem = array();

$i = 0;

while ($i <= 5000) {

$xml = simplexml_load_file('C:/wwwroot/www-php/resposta.xml');

foreach($xml->resposta as $resposta)

{

if(empty($resposta)){

$i=5000;break;

}

/*Header*/

$MsgId= $resposta->MsgId;

$CreDtTm= $resposta->CreDtTm;

/*OrgnlGrpInfAndSts*/

$OrgnlMsgId= $resposta->OrgnlMsgId;

$OrgnlMsgNmId= $resposta->OrgnlMsgNmId;

$OrgnlNbOfTxs= $resposta->OrgnlNbOfTxs;

$OrgnlCtrlSum= $resposta->OrgnlCtrlSum;

$Prtry= $resposta->Prtry;

/*OrgnlPmtInfAndSts*/

$OrgnlPmtInfId= $resposta->OrgnlPmtInfId;

$OrgnlNbOfTxs= $resposta->OrgnlNbOfTxs;

$OrgnlCtrlSum= $resposta->OrgnlCtrlSum;

$Prtry= $resposta->Prtry;

/*TxInfAndSts*/

$StsId = $resposta ->StsId;

$OrgnlEndToEndId = $resposta ->OrgnlEndToEndId;

$RsnCd = $resposta ->Rsn->Cd;

$InstdAmt = $resposta ->InstdAmt;

$ReqdColltnDt = $resposta ->ReqdColltnDt;

$SeqTp = $resposta ->SeqTp;

$PmtMtd = $resposta ->PmtMtd;

$DbtrNm = $resposta ->Dbtr ->Nm;

$IBAN = $resposta ->IBAN;

$DbtrAgtBIC = $resposta ->DbtrAgt ->FinInstnId ->BIC;

$CdtrAgtBIC = $resposta ->CdtrAgt ->FinInstnId ->BIC;

$CdtrNm = $resposta ->Cdtr ->Nm;

$CdtrAcctIBAN = $resposta ->CdtrAcct ->Id ->IBAN;

$dadosQueSeRepetem[] = array("StsId" => $StsId, "OrgnlEndToEndId" => $OrgnlEndToEndId, "RsnCd" => $RsnCd, "InstdAmt" => $InstdAmt, "ReqdColltnDt" => $ReqdColltnDt,

"SeqTp" => $SeqTp, "PmtMtd" => $PmtMtd, "DbtrNm" => $DbtrNm, "IBAN" => $IBAN, "DbtrAgtBIC" => $DbtrAgtBIC, "CdtrAgtBIC" => $CdtrAgtBIC,

"CdtrNm" => $CdtrNm, "CdtrAcctIBAN" => $CdtrAcctIBAN);

echo $MsgId;

echo $CreDtTm;

echo $OrgnlMsgId;

echo $OrgnlMsgNmId;

echo $OrgnlNbOfTxs;

echo $OrgnlCtrlSum;

echo $Prtry;

echo $OrgnlPmtInfId;

echo $OrgnlNbOfTxs;

echo $OrgnlCtrlSum;

echo $Prtry;

echo $StsId;

echo $OrgnlEndToEndId;

echo $RsnCd;

echo $InstdAmt;

echo $ReqdColltnDt;

echo $SeqTp;

echo $PmtMtd;

echo $DbtrNm;

echo $IBAN;

echo $DbtrAgtBIC;

echo $CdtrAgtBIC;

echo $CdtrNm;

echo $CdtrAcctIBAN;

$i++;

}

}

?>

Mas depois quando executo ele não lê o file XML e dá este erro "Fatal error: Maximum execution time of 30 seconds exceeded in C:\wwwroot\www-php\new.php on line 8"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jokimen

Porque existem tags no ficheiro que se repetem várias vezes que corresponde

ao número de transações bancárias necessárias

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Porque existem tags no ficheiro que se repetem várias vezes que corresponde

ao número de transações bancárias necessárias

não foi isso que perguntei ...

porque é que estás a abrir e fazer o parsing do mesmo ficheiro (completo) 5000 vezes ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jokimen

não foi isso que perguntei ...

Sou novo no PHP e pensei que era a solução mas devia apenas fazer parsing da tag TxInfAndSts

Happy consegues me ajudar a resolver isto, tenho de entregar hoje ao final do dia a funcionar e só me falta isto

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jokimen

não foi isso que perguntei ...

Boas Happy

Já resolvi a situação de ler o xml com recurso a outra função contudo necessitava correr vários ciclos à tag TxInfAndSts

pois podem existir várias transações, contudo quando corro o ciclo o script não responde, se correr o script sem um ciclo

funciona tudo bem.

Aqui fica o meu código

<?php

$dadosQueSeRepetem = array();

$doc = new DOMDocument();

$doc->load('resposta.xml');

$respostasGrpHdr = $doc->getElementsByTagName("GrpHdr");

foreach( $respostasGrpHdr as $respostaGrpHdr)

{

$MsgIds = $respostaGrpHdr->getElementsByTagName("MsgId");

$MsgId = $MsgIds->item(0)->nodeValue;

$CreDtTms = $respostaGrpHdr->getElementsByTagName("CreDtTm");

$CreDtTm = $CreDtTms->item(0)->nodeValue;

}

$respostasOrgnlGrpInfAndSts = $doc->getElementsByTagName("OrgnlGrpInfAndSts");

foreach( $respostasOrgnlGrpInfAndSts as $respostasOrgnlGrpInfAndSt)

{

$OrgnlMsgIds = $respostasOrgnlGrpInfAndSt->getElementsByTagName("OrgnlMsgId");

$OrgnlMsgId = $OrgnlMsgIds->item(0)->nodeValue;

$OrgnlMsgNmIds = $respostasOrgnlGrpInfAndSt->getElementsByTagName("OrgnlMsgNmId");

$OrgnlMsgNmId = $OrgnlMsgNmIds->item(0)->nodeValue;

$OrgnlNbOfTxs = $respostasOrgnlGrpInfAndSt->getElementsByTagName("OrgnlNbOfTxs");

$OrgnlNbOfTx = $OrgnlNbOfTxs->item(0)->nodeValue;

$OrgnlCtrlSums = $respostasOrgnlGrpInfAndSt->getElementsByTagName("OrgnlCtrlSum");

$OrgnlCtrlSum = $OrgnlCtrlSums->item(0)->nodeValue;

$Prtrys = $respostasOrgnlGrpInfAndSt->getElementsByTagName("Prtry");

$Prtry = $Prtrys->item(0)->nodeValue;

}

$respostasOrgnlPmtInfAndSts = $doc->getElementsByTagName("OrgnlPmtInfAndSts");

foreach( $respostasOrgnlPmtInfAndSts as $respostasOrgnlPmtInfAndSt)

{

$OrgnlPmtInfIds = $respostasOrgnlPmtInfAndSt->getElementsByTagName("OrgnlPmtInfId");

$OrgnlPmtInfId = $OrgnlPmtInfIds->item(0)->nodeValue;

$OOrgnlNbOfTxs = $respostasOrgnlPmtInfAndSt->getElementsByTagName("OrgnlNbOfTxs");

$OOrgnlNbOfTx = $OOrgnlNbOfTxs->item(0)->nodeValue;

$OOrgnlCtrlSums = $respostasOrgnlPmtInfAndSt->getElementsByTagName("OrgnlCtrlSum");

$OOrgnlCtrlSum = $OOrgnlCtrlSums->item(0)->nodeValue;

$PPrtrys = $respostasOrgnlPmtInfAndSt->getElementsByTagName("Prtry");

$PPrtry = $PPrtrys->item(0)->nodeValue;

$i = 0;

while ($i <= 50) {

if(empty($respostasOrgnlPmtInfAndSts)){

$i=50;break;

}

$StsIds = $respostasOrgnlPmtInfAndSt->getElementsByTagName("StsId");

$StsId = $StsIds->item(0)->nodeValue;

$OrgnlEndToEndIds = $respostasOrgnlPmtInfAndSt->getElementsByTagName("OrgnlEndToEndId");

$OrgnlEndToEndId = $OrgnlEndToEndIds->item(0)->nodeValue;

$Cds = $respostasOrgnlPmtInfAndSt->getElementsByTagName("Cd");

$Cd = $Cds->item(0)->nodeValue;

$InstdAmts = $respostasOrgnlPmtInfAndSt->getElementsByTagName("InstdAmt");

$InstdAmt = $InstdAmts->item(0)->nodeValue;

$ReqdColltnDts = $respostasOrgnlPmtInfAndSt->getElementsByTagName("ReqdColltnDt");

$ReqdColltnDt = $ReqdColltnDts->item(0)->nodeValue;

$SeqTps = $respostasOrgnlPmtInfAndSt->getElementsByTagName("SeqTp");

$SeqTp = $SeqTps->item(0)->nodeValue;

$PmtMtds = $respostasOrgnlPmtInfAndSt->getElementsByTagName("PmtMtd");

$PmtMtd = $PmtMtds->item(0)->nodeValue;

$respostasDbtrs = $doc->getElementsByTagName("Dbtr");

foreach( $respostasDbtrs as $respostasDbtr)

{

$DbtrNms = $respostasDbtr->getElementsByTagName("Nm");

$DbtrNm = $DbtrNms->item(0)->nodeValue;

}

$respostasDbtrAccts = $doc->getElementsByTagName("DbtrAcct");

foreach( $respostasDbtrAccts as $respostasDbtrAcct)

{

$DbtrAcctIBANs = $respostasDbtrAcct->getElementsByTagName("IBAN");

$DbtrAcctIBAN = $DbtrAcctIBANs->item(0)->nodeValue;

}

$respostasDbtrAgts = $doc->getElementsByTagName("DbtrAgt");

foreach( $respostasDbtrAgts as $respostasDbtrAgt)

{

$DbtrAgtBICs = $respostasDbtrAgt->getElementsByTagName("BIC");

$DbtrAgtBIC = $DbtrAgtBICs->item(0)->nodeValue;

}

$respostasCdtrAgts = $doc->getElementsByTagName("CdtrAgt");

foreach( $respostasCdtrAgts as $respostasCdtrAgt)

{

$CdtrAgtBICs = $respostasCdtrAgt->getElementsByTagName("BIC");

$CdtrAgtBIC = $CdtrAgtBICs->item(0)->nodeValue;

}

$respostasCdtrs = $doc->getElementsByTagName("Cdtr");

foreach( $respostasCdtrs as $respostasCdtr)

{

$CdtrNms = $respostasCdtr->getElementsByTagName("Nm");

$CdtrNm = $CdtrNms->item(0)->nodeValue;

}

$respostasCdtrAccts = $doc->getElementsByTagName("CdtrAcct");

foreach( $respostasCdtrAccts as $respostasCdtrAcct)

{

$CdtrAcctIBANs = $respostasCdtrAcct->getElementsByTagName("IBAN");

$CdtrAcctIBAN = $CdtrAcctIBANs->item(0)->nodeValue;

}

$dadosQueSeRepetem[] = array("StsId" => $StsId, "OrgnlEndToEndId" => $OrgnlEndToEndId, "Cd" => $Cd, "InstdAmt" => $InstdAmt, "ReqdColltnDt" => $ReqdColltnDt,

"SeqTp" => $SeqTp, "PmtMtd" => $PmtMtd, "DbtrNm" => $DbtrNm, "DbtrAcctIBAN" => $DbtrAcctIBAN, "DbtrAgtBIC" => $DbtrAgtBIC, "CdtrAgtBIC" => $CdtrAgtBIC,

"CdtrNm" => $CdtrNm, "CdtrAcctIBAN" => $CdtrAcctIBAN);

}

}

echo "$MsgId - $CreDtTm<br>";

echo "$OrgnlMsgId - $OrgnlMsgNmId - $OrgnlNbOfTx - $OrgnlCtrlSum - $Prtry<br>";

echo "$OrgnlPmtInfId - $OOrgnlNbOfTx - $OOrgnlNbOfTx - $OOrgnlCtrlSum - $PPrtry<br>";

print_r ($dadosQueSeRepetem);

?>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.