如何在第一个元素xpath中发现元素的出现

时间:2019-07-05 07:36:25

标签: php xpath

具有这样的XML结构:

<w:document>
    <w:body>
      <w:p>{textcontent}</w:p>
      <w:p>
          <w:drawing>
          </w:drawing>
      </w:p>
      <w:p>{no textcontent}</w:p>
      <w:p>
          <w:drawing>
          </w:drawing>
      </w:p>
      <w:p>{no textcontent}</w:p>
      <w:p>text..</w:p>

      <w:tbl>three</w:tbl>
      <w:p>four</w:p>
  </w:body>
</w:document>

我要检查图纸的出现并计数nr

我已经尝试过:

$document = new DOMDocument(); 
$document->loadXML($xml_str);
$xpath = new DOMXpath($document);
$xpath->registerNamespace(
   'wspace', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'
);

$pindex = 0;
foreach ($xpath->evaluate('//wspace:p') as $index => $p_node) 
{
    if (strlen($p_node->textContent)>0) {

        //I just want to know if drawing exists in this $p_node..
        //if the the node contains any content
        $child_nodes = $xpath->evaluate('//wspace:drawing', $p_node);
        var_dump($child_nodes[0]);
        $pindex++;
        //But I get an object for each pnode. I just want an object when there
        //is an actualy <w:drawing> inside of <p> (item with index 1,3 in above example)
    }
}   

如何检查<w:p><w:drawing>的发生次数?

我可以这样计算发生的次数:

foreach ($xpath->evaluate('//wspace:p//wspace:drawing') as $index => $node) 
{
    var_dump($node);
}  

但是我也需要p($pindex)的索引。

我也一直在尝试evaluate('/child')evaluate('node()/child')失败。

我的表情出了什么问题?

2 个答案:

答案 0 :(得分:0)

严格从xpath角度来看:

添加

<root  xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
[your xml above]
</root>

在您的xml之前和之后尝试

count(//w:p/w:drawing)

输出:

  

2.0

如果需要整数而不是float,请将表达式更改为

round(count(//w:p/w:drawing))

希望对其他人有帮助。

答案 1 :(得分:0)

我实际上找到了自己的问题的答案:-)

代替:

$child_nodes = $xpath->evaluate('//wspace:drawing', $p_node);

我只是在当前$ p_node上使用childNodes:

$child_nodes = $p_node->childNodes;
foreach($child_nodes as $rc) 
{
    if ($rc->localName == 'drawing') 
    {
     $img_count++;
     echo 'P=' . $pindex;
    }
}