PHP XMLNode, предикат выбора DOMnode Xpath для значения атрибута внука - PullRequest
0 голосов
/ 05 сентября 2018

у меня есть xml

<div> First Element
 <div>
  <level3 name="fred">
  </level3>
 </div>
</div>
<div> Second Element
 <div>
  <level3 name="dave">
  </level3>
 </div>
</div>
<div> Third Element
 <div>
  <level3 name="jim">
  </level3>
 </div>
</div>
<div> Fifth Element
 <div>
  <level3 name="mike">
  </level3>
 </div>
</div>

Я хочу извлечь xml (в виде строки, включая теги xml) из определенного элемента div верхнего уровня на основе имени его внуков на уровне 3.

Итак, чтобы получить верхний div над узлом level3 с именем jim, я смотрю на такие вещи, как:

$sname="jim";
$spath = new DOMXPath($doc);
// Find a div with a child div with a level3 with a matching attribute name. 
$spexp = "//div[./div/level3[contains(@name,\"$sname\")]]";
$story = $spath->evaluate("$spexp");
echo $story->item(0)->nodeValue . "\n";

Я пробовал различные комбинации, включая «существует» в предикате, который, я уверен, является базовым xslt, но не в PHP (!).

У меня есть гугл-нагрузки ... но предикаты, выходящие за пределы непосредственного уровня, не поднялись, и кажется, что PHP-xpath имеет свой собственный вкус, поэтому общие вещи в XPath не всегда полезны.

1 Ответ

0 голосов
/ 05 сентября 2018

XPath был в порядке, он просто удаляет первый бит внутри первого [, так как он не нужен.

Чтобы вывести XML, вам нужно использовать saveXML() с узлом, в который вы хотите экспортировать все теги XML ...

$sname="jim";
$spath = new DOMXPath($doc);
// Find a div with a child div with a level3 with a matching attribute name.
$spexp = "//div[div/level3[contains(@name,\"$sname\")]]";
$story = $spath->evaluate("$spexp");
echo $doc->saveXML($story->item(0)). "\n";

Придает ...

<div> Third Element
 <div>
  <level3 name="jim">
  </level3>
 </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...