具有follow-sibling的强元素之后的xpath文本不起作用

时间:2013-04-02 23:35:08

标签: php html xpath simplexml siblings

我检查了很多例子

following-sibling::text()[1]

是在强标记之后接收文本的正确答案。我用星号标记了我感兴趣的文字:

    <?php
    $html='
      <html>
        <head>
        </head>
        <body>    
            <div class="someclass">
                <h2 class="h3">header 1</h2>
                <ul class="bulleted">
                    <li><strong>prop1: </strong>**name**</li>
                    <li><strong>prop2: </strong>**street**</li>
                    <li><strong>prop is 3: </strong>**city**</li>
                    <li><strong>prop 4: </strong>**more**</li>
                </ul>
            </div>
        </body>
    </html>
';
    $doc = new DOMDocument();
    $doc->strictErrorChecking = FALSE;
    $doc->loadHtml($html);
    $data = simplexml_import_dom($doc);
    $properties = $data->xpath('//strong/following-sibling::text()[1]');

    var_dump($properties);

我总得到的是[强]的内容,而不是[li] [/ li]中没有[strong]内容的文字:

array(4) {
  [0] =>
  class SimpleXMLElement#3 (1) {
    public $strong =>
    string(7) "prop1: "
  }
  [1] =>
  class SimpleXMLElement#4 (1) {
    public $strong =>
    string(7) "prop2: "
  }
  [2] =>
  class SimpleXMLElement#5 (1) {
    public $strong =>
    string(11) "prop is 3: "
  }
  [3] =>
  class SimpleXMLElement#6 (1) {
    public $strong =>
    string(8) "prop 4: "
  }
}

如果你指出我做的错误,我会很高兴...

1 个答案:

答案 0 :(得分:4)

不要将SimpleXML用于此XPath操作,它在某些方面受到限制,在您的情况下,限制是您无法使用SimpleXML Xpath返回文本节点。 DOMXPath功能更强大,它可以返回所有节点类型,包括文本节点:

$xpath = new DOMXpath($doc);
$properties = $xpath->query('//strong/following-sibling::text()[1]');

foreach ($properties as $property)
  var_dump($property->textContent);

结果:

string(8) "**name**"
string(10) "**street**"
string(8) "**city**"
string(8) "**more**"