duanhuo3392 2018-09-05 12:11
浏览 59
已采纳

PHP XMLNode,DOMnode Xpath选择谓词的孙子属性值

I have some 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>

I want to extract the xml (as a string, including the xml tags) from a specific top level div element based in its grandchilds name at level3.

So to get the top div above the level3 node with the name of jim I have been looking at things like:

$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 . "
";

I have tried various combinations - including 'exists' in the predicate which I am sure is basic xslt, but not in PHP(!).

I have googled loads... but predicates going down past the immediate level hasn't come up, and it seems PHP's xpath has its own flavour, so general XPath stuff isn't always useful.

  • 写回答

1条回答 默认 最新

  • duandunzhuo3234 2018-09-05 12:19
    关注

    The XPath was OK, this just removes the first bit inside the first [ as it's not needed.

    To output the XML, you need to use saveXML() with the node you want to export all of the XML tags as well...

    $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)). "
    ";
    

    Gives...

    <div> Third Element
     <div>
      <level3 name="jim">
      </level3>
     </div>
    </div>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?