如果我在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);
}
答案 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)'));