使用XPATH获取具有类名的标签

时间:2018-09-11 16:14:18

标签: php xpath

下面是我的xml

<div class="image">
<img  src="">
<div class="image-text"><p class="border_style">work </p></div>
</div>

我想获取class =“ image-text”内的所有内容

输出

<p class="border_style">work </p>

如何使用XPath做到这一点?或其他方式?

我已经尝试过了

$image->xpath("*[@class='image-text']")但无效。

请咨询

$i = 0;
$imageXmlParts = $xmlobject->xpath("//div[@class='block-image']");

$imageText = $xmlobject->xpath("//*[@class='block-image-text']");


foreach ( $imageText as $image ){
    echo $image->asXML().PHP_EOL;
    $out = "";
    foreach ( $image->children() as $content )  {
        $out .= $content->asXML();
    }
    echo $out.PHP_EOL;
}


foreach ($imageXmlParts as $imageXml) {

    $i++;
    $imagedata = array(
        'template'  => (string) $this->template,
        'src'           => (string) $imageXml->img['src'],

        'imagetext' => ///need to add here
    ));
}

1 个答案:

答案 0 :(得分:1)

使用您拥有的XPath应该会为您提供以下内容...

$imageText = $image->xpath("//*[@class='image-text']");
echo $imageText[0]->asXML().PHP_EOL;

给予...

<div class="image-text">
        <p class="border_style">work </p>
    </div>

,其中包括节点本身。使用[0]给出与XPath表达式匹配的第一项,因为xpath()总是返回匹配数组。

如果只需要内容,则必须从找到的内容的子节点中构建内容...

$out = "";
foreach ( $imageText[0]->children() as $content )  {
    $out .= $content->asXML();
}
echo $out;

这只是给...

<p class="border_style">work </p>

更新

要将其添加到您拥有的代码中,我对其进行了一些重新构造,以使其开始查找外部标签(我认为是使用名为block-image的类),然后对其进行循环。然后,它将在此元素内使用XPath来查找其文本。

$imageXmlParts = $image->xpath("//*[@class='block-image']");
$imagedata = array();
foreach ( $imageXmlParts as $imageXml ){
    $text = $imageXml->xpath("descendant::div[@class='block-image-text']");
    $out = "";
    foreach ( $text[0]->children() as $content )  {
        $out .= $content->asXML();
    }
    if ( $out == "" )   {
        $out = (string)$text[0];
    }
    $imagedata[] = array(
        'template'  => (string) $this->template,
        'src'       => (string) $imageXml->img['src'],
        'imagetext' => $out
    );
}

最终更新:

仅从节点中提取XML然后删除标签可能会更容易-

$out = $text[0]->asXML();

给你...

<div class="block-image-text">
            <p class="border_style">work </p>
            aaaa
        </div>

您也许可以使用正则表达式删除标记,但是我已经进行了简单的替换并切断了字符串关闭方法的最后一部分...

foreach ( $imageXmlParts as $imageXml ){
    $text = $imageXml->xpath("descendant::div[@class='block-image-text']");
    $out = $text[0]->asXML();
    $out = str_replace('<div class="block-image-text">', '', $out);
    $out = substr($out, 0, -6);
    $imagedata[] = array(
        'template'  => (string) '$this->template',
        'src'       => (string) $imageXml->img['src'],
        'imagetext' => $out
    );
}