2013-02-19 149 views
4

我试图计算节点有多少次出现在我的XML和存储在一个变量这个数字:如何在PHP中使用Xpath的count函数?

<?php 

$xmlStr = file_get_contents('books.xml'); 
$xml = new SimpleXMLElement($xmlStr); 

$res = $xml->xpath("count(catalog/book)"); 
print_r($res); 

?> 

的XML:

<?xml version="1.0"?> 
<catalog> 
<book id="bk101"> 
    <author>Gambardella, Matthew</author> 
    <title>XML Developer's Guide</title> 
    <genre>Computer</genre> 
    <price>44.95</price> 
    <publish_date>2000-10-01</publish_date> 
    <description>An in-depth look at creating applications 
    with XML.</description> 
</book> 
<book id="bk102"> 
    <author>Ralls, Kim</author> 
    <title>Midnight Rain</title> 
    <genre>Fantasy</genre> 
    <price>5.95</price> 
    <publish_date>2000-12-16</publish_date> 
    <description>A former architect battles corporate zombies, 
    an evil sorceress, and her own childhood to become queen 
    of the world.</description> 
</book> 
<book id="bk103"> 
    <author>Corets, Eva</author> 
    <title>Maeve Ascendant</title> 
    <genre>Fantasy</genre> 
    <price>5.95</price> 
    <publish_date>2000-11-17</publish_date> 
    <description>After the collapse of a nanotechnology 
    society in England, the young survivors lay the 
    foundation for a new society.</description> 
</book> 
<book id="bk104"> 
    <author>Corets, Eva</author> 
    <title>Oberon's Legacy</title> 
    <genre>Fantasy</genre> 
    <price>5.95</price> 
    <publish_date>2001-03-10</publish_date> 
    <description>In post-apocalypse England, the mysterious 
    agent known only as Oberon helps to create a new life 
    for the inhabitants of London. Sequel to Maeve 
    Ascendant.</description> 
</book> 
<book id="bk105"> 
    <author>Corets, Eva</author> 
    <title>The Sundered Grail</title> 
    <genre>Fantasy</genre> 
    <price>5.95</price> 
    <publish_date>2001-09-10</publish_date> 
    <description>The two daughters of Maeve, half-sisters, 
    battle one another for control of England. Sequel to 
    Oberon's Legacy.</description> 
</book> 
<book id="bk106"> 
    <author>Randall, Cynthia</author> 
    <title>Lover Birds</title> 
    <genre>Romance</genre> 
    <price>4.95</price> 
    <publish_date>2000-09-02</publish_date> 
    <description>When Carla meets Paul at an ornithology 
    conference, tempers fly as feathers get ruffled.</description> 
</book> 
<book id="bk107"> 
    <author>Thurman, Paula</author> 
    <title>Splish Splash</title> 
    <genre>Romance</genre> 
    <price>4.95</price> 
    <publish_date>2000-11-02</publish_date> 
    <description>A deep sea diver finds true love twenty 
    thousand leagues beneath the sea.</description> 
</book> 
<book id="bk108"> 
    <author>Knorr, Stefan</author> 
    <title>Creepy Crawlies</title> 
    <genre>Horror</genre> 
    <price>4.95</price> 
    <publish_date>2000-12-06</publish_date> 
    <description>An anthology of horror stories about roaches, 
    centipedes, scorpions and other insects.</description> 
</book> 
<book id="bk109"> 
    <author>Kress, Peter</author> 
    <title>Paradox Lost</title> 
    <genre>Science Fiction</genre> 
    <price>6.95</price> 
    <publish_date>2000-11-02</publish_date> 
    <description>After an inadvertant trip through a Heisenberg 
    Uncertainty Device, James Salway discovers the problems 
    of being quantum.</description> 
</book> 
<book id="bk110"> 
    <author>O'Brien, Tim</author> 
    <title>Microsoft .NET: The Programming Bible</title> 
    <genre>Computer</genre> 
    <price>36.95</price> 
    <publish_date>2000-12-09</publish_date> 
    <description>Microsoft's .NET initiative is explored in 
    detail in this deep programmer's reference.</description> 
</book> 
<book id="bk111"> 
    <author>O'Brien, Tim</author> 
    <title>MSXML3: A Comprehensive Guide</title> 
    <genre>Computer</genre> 
    <price>36.95</price> 
    <publish_date>2000-12-01</publish_date> 
    <description>The Microsoft MSXML3 parser is covered in 
    detail, with attention to XML DOM interfaces, XSLT processing, 
    SAX and more.</description> 
</book> 
<book id="bk112"> 
    <author>Galos, Mike</author> 
    <title>Visual Studio 7: A Comprehensive Guide</title> 
    <genre>Computer</genre> 
    <price>49.95</price> 
    <publish_date>2001-04-16</publish_date> 
    <description>Microsoft Visual Studio 7 is explored in depth, 
    looking at how Visual Basic, Visual C++, C#, and ASP+ are 
    integrated into a comprehensive development 
    environment.</description> 
</book> 
</catalog> 

下面将打印出的数组书在屏幕上:

<?php 

$xmlStr = file_get_contents('books.xml'); 
$xml = new SimpleXMLElement($xmlStr); 

$res = $xml->xpath("/catalog/book"); 
print_r($res); 

?> 

我只是想不通,为什么计数功能不起作用。

+0

它不起作用,因为您正在使用SimpleXml,这是用于“简单”UseCases。如果您想从XPath查询返回类型化结果,则必须使用['DOMXPath :: evaluate'](http://php.net/manual/en/domxpath.evaluate.php)。 – Gordon 2013-02-19 10:25:42

回答

2

您可以直接在$res上使用count(),而不是在xpath中应用它。

echo count($res); 

这样做的原因是,XPath返回SimpleXMLElement类型的数组,其中包含在所述的xpath参数路径的所有节点。

+0

不错的作品,它给了我有多少书的计数!但是当我分配作者id的时候,我正在思考,作者可以出现两次,你知道我可以怎样计算出有多少作者?谢谢!!! – deucalion0 2013-02-19 10:16:20

+0

你可以得到作者数组,然后使用'array_unique'对数组进行过滤 – Achrome 2013-02-19 10:17:22

+0

Ashwin你能指点我这样做吗?谢谢! – deucalion0 2013-02-19 10:31:54

4

SimpleXML不幸的是不支持任何XPath查询,不返回节点集。考虑在结果数组上使用count()来代替。