Как мне найти вхождение элемента внутри первого элемента xpath - PullRequest
1 голос
/ 05 июля 2019

С такой 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>

Я хочу проверить наличие и считать количество рисунков

Я пробовал это:

$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 голосов
/ 05 июля 2019

Я действительно нашел ответ на свой вопрос: -)

Вместо:

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

Я просто использую childNodes для текущего $p_node:

$child_nodes = $p_node->childNodes;
foreach($child_nodes as $rc) 
{
    if ($rc->localName == 'drawing') 
    {
     $img_count++;
     echo 'P=' . $pindex;
    }
}
0 голосов
/ 05 июля 2019

Строго от угла xpath:

Добавление

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

до и после вашего xml и попытка

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

дает вывод:

2.0

Если вам нужно целое число вместо числа с плавающей точкой, измените выражение на

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

Надеюсь, что поможет с остальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...