计算XML文件中特定标记的编号 - PHP

时间:2014-07-01 11:59:57

标签: php xml

如果我在XML文件中有以下结构;

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CstmrDrctDbtInitn>
    <GrpHdr>
      <MsgID>rBYEqfjzEU</MsgID>
      <CreDtTm>2014-07-01T12:36:15</CreDtTm>
      <NbOfTxs>2</NbOfTxs>
      <CtrlSum>400.4</CtrlSum>
      <InitgPty>
        <Id>
          <PrvtId>
            <Othr>
              <Id>IA1234567</Id>
            </Othr>
          </PrvtId>
        </Id>
      </InitgPty>
    </GrpHdr>
  </CstmrDrctDbtInitn>
</Document>

上述代码表示<CstmrDrctDbtInitn>和&lt; \ CstmrDrctDbtInitn&gt;之间的一个事务。标签。此文件将被追加以包含更多以<CstmrDrctDbtInitn><\CstmrDrctDbtInitn>标记开头和结尾的交易。我需要计算文件中的事务数,所以我基本上需要计算文件中<CstmrDrctDbtInitn>个标签的数量。有什么建议?对不起,如果我解释这个很糟糕,很困惑!

我按照建议更改了以下PHP代码,但没有运气:(

$filename = date('Y-W').'.xml'; //2014-26.xml

//Check if a file exists
if (file_exists($filename)) 
    {
    $dom = simplexml_load_string($xml);
    global $NumberTransactions;
    $NumberTransactions = count($dom->CstmrDrctDbtInitn);
    // call xml appendFile function
    appendFile($filename);
    }
else 
    {
    // call xml createFile function
    createFile($filename);
    }

2 个答案:

答案 0 :(得分:0)

假设您的意思是计算GrpHdr下的子节点数 - 您可以使用SimpleXML:

    $xml = '<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CstmrDrctDbtInitn>
    <GrpHdr>
      <MsgID>rBYEqfjzEU</MsgID>
      <CreDtTm>2014-07-01T12:36:15</CreDtTm>
      <NbOfTxs>2</NbOfTxs>
      <CtrlSum>400.4</CtrlSum>
      <InitgPty>
        <Id>
          <PrvtId>
            <Othr>
              <Id>IA1234567</Id>
            </Othr>
          </PrvtId>
        </Id>
      </InitgPty>
    </GrpHdr>
    </CstmrDrctDbtInitn>
</Document>';

    $dom = simplexml_load_string($xml);

    // var_dump($dom->CstmrDrctDbtInitn->GrpHdr);
    echo count($dom->CstmrDrctDbtInitn->GrpHdr->children());

如果你想要一个变体,你应该能够通过取消注释var_dump行并完成对象结构来获得结构的良好线索。

如果您有其他意义 - 请告诉我们您希望计数值基于您的示例数据的详细信息,为我们提供线索。

=====================下面的澄清更新=============

要计算CstmrDrctDbtInitn组的数量,您可以使用原始示例,但计数行将是:

echo count($dom->CstmrDrctDbtInitn);

答案 1 :(得分:0)

DOMXpath :: evaluate()可以使用Xpath来计算节点。

// create and load
$dom= new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

// register an alias/prefix for the namespace
$xpath->registerNamespace('iso', 'urn:iso:std:iso:20022:tech:xsd:pain.008.001.02');

// get the count
var_dump($xpath->evaluate('count(//iso:CstmrDrctDbtInitn)'));

演示:https://eval.in/169122