簡體   English   中英

有沒有一種簡單的方法來獲取DomDocument和DomXPath的子元素?

[英]Is there an easy way to get subelements with DomDocument and DomXPath?

假設我有這樣的HTML:

<div id="container">
    <li class="list">
        Test text
    </li>
</div>

我想得到li的內容。

我可以使用以下代碼獲取容器div的內容:

$html = '
<div id="container">
    <li class="list">
        Test text
    </li>
</div>';

$dom = new \DomDocument;
$dom->loadHTML($html);

$xpath = new \DomXPath($dom);

echo $dom->saveHTML($xpath->query("//div[@id='container']")->item(0));

我希望通過簡單地將它添加到查詢中來獲取子元素的內容(就像你在simpleHtmlDom中可以做到的那樣):

echo $dom->saveHTML($xpath->query("//div[@id='container'] li[@class='list']")->item(0));

但是一個警告(后面是一個致命的錯誤)被拋出,說:

 Warning: DOMXPath::query(): Invalid expression ...

我知道要做我想要的唯一方法是:

$html = '
<div id="container">
    <li class="list">
        Test text
    </li>
</div>';

$dom = new \DomDocument;
$dom->loadHTML($html);
$xpath = new \DomXPath($dom);

$dom2 = new \DomDocument;
$dom2->loadHTML(trim($dom->saveHTML($xpath->query("//div[@id='container']")->item(0))));
$xpath2       = new \DomXPath($dom2);

echo $xpath2->query("//li[@class='list']")->item(0)->nodeValue;

然而,這是為了獲取li的內容而進行的大量代碼,問題在於項目嵌套得更深(如果我想得到`div#container ul.container li.list)我必須繼續添加越來越多的代碼。

使用simpleHtmlDom,我所要做的就是:

$html->find('div#container li.list', 0);

我錯過了使用DomDocument和DomXPath做事的簡單方法,還是真的很難?

你最初的嘗試很接近; 你的語法只是一個角色。 嘗試以下XPath:

//div[@id='container']/li[@class='list']

你可以看到div節點和li節點之間有一個空格,那里應該有正斜杠。

SimpleHTMLDOM使用CSS選擇器,而不是Xpath。 CSS選擇器中的任何內容也可以使用Xpath完成。 DOMXpath :: query()僅支持返回節點列表的Xpath表達式,但Xpath也可以返回標量。

在Xpath中, /用於分隔位置路徑的各個部分,而不是空格。 它還有兩個含義。 A /在位置路徑的開頭使其成為絕對路徑(它從文檔而不是當前上下文節點開始)。 第二個/是后代軸的短語法。

嘗試:

$html = '
<div id="container">
    <li class="list">
        Test text
    </li>
</div>';

$dom = new \DomDocument;
$dom->loadHTML($html);
$xpath = new \DomXPath($dom);

echo trim($xpath->evaluate("string(//div[@id='container']//li[@class='list'])"));

輸出:

Test text

在CSS選擇器序列中,空間是兩個選擇器的組合子。

  • CSS: foo bar
  • Xpath短語法: //foo//bar
  • Xpath完整語法: /descendant::foo/descendant::bar

另一個組合子將是>為一個孩子。 此軸是Xpath中的默認軸。

  • CSS: foo > bar
  • Xpath短語法: //foo/bar
  • Xpath完整語法: /descendant::foo/child::bar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM