Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP XPath问题_Php_Xml_Xpath - Fatal编程技术网

PHP XPath问题

PHP XPath问题,php,xml,xpath,Php,Xml,Xpath,有一个真正的Xpath问题的麻烦。我正在尝试将节点与某个值匹配 下面是一个示例XML片段 我试图匹配给定的MatchNumber节点值,以查看是否有两个或更多个节点。假设它存储在一个名为$data的变量中,我将使用下面的表达式。我已经有一段时间没有做过很多XPath了,因为现在大多数事情似乎都是JSON,所以请原谅任何新手的疏忽 $doc = new DOMDocument; $doc->load($data); $xpath = new DOMXPath($doc); $result

有一个真正的Xpath问题的麻烦。我正在尝试将节点与某个值匹配

下面是一个示例XML片段

我试图匹配给定的MatchNumber节点值,以查看是否有两个或更多个节点。假设它存储在一个名为$data的变量中,我将使用下面的表达式。我已经有一段时间没有做过很多XPath了,因为现在大多数事情似乎都是JSON,所以请原谅任何新手的疏忽

$doc = new DOMDocument;
$doc->load($data);
$xpath = new DOMXPath($doc);
$result = $xpath->query("/CupRoundSpot/MatchNumber[.='1']");
我需要基本上匹配匹配号值为1的任何节点,然后确定结果长度是否大于1(即找到2个或更多)

非常感谢您的帮助。

以下XPath:

/CupRoundSpot[MatchNumber = 1]
返回所有
CupRoundSpot
节点,其中
MatchNumber
等于1。您可以在PHP中进一步使用这些节点来处理它

执行:

count(/CupRoundSpot[MatchNumber = 1])

返回找到的
MatchNumber
等于1的
curoundspot
节点总数。

您的XML文档具有默认命名空间:
xmlns=”http://www.fixtureslive.com/“

您必须在xpath元素上添加前缀,并在查询中使用(已注册)前缀

$xpath->registerNamespace ('fl' , 'http://www.fixtureslive.com/');
$result = $xpath->query("/fl:ArrayOfCupRoundSpot/fl:CupRoundSpot/fl:MatchNumber[.='1']");
foreach( $result as $e ) {
    echo '.';   
}

您必须注册名称空间。之后,可以使用Xpath
count()
函数。这样的表达式只适用于
evaluate()
,而不适用于
query()
query()
只能返回节点列表,不能返回标量值

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$xpath->registerNamespace('fl', 'http://www.fixtureslive.com/');

var_dump(
  $xpath->evaluate(
    'count(/fl:ArrayOfCupRoundSpot/fl:CupRoundSpot[number(fl:MatchNumber) = 1])'
  )
);
输出:

float(2)
演示:

要迭代CupRoundSpot节点,只需使用foreach:

$nodes = $xpath->evaluate(
  '/fl:ArrayOfCupRoundSpot/fl:CupRoundSpot[number(fl:MatchNumber) = 1]'
);
foreach ($nodes as $node) {
  //...
}

干杯我试过运行,但仍然没有得到匹配/结果。非常令人沮丧$doc->loadXML($data);问题是什么工具!干杯,伙计们!干杯我试过运行,但仍然没有得到匹配/结果。非常令人沮丧!