首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XPATH获取带有类名的标记

使用XPATH获取带有类名的标记
EN

Stack Overflow用户
提问于 2018-09-11 16:14:18
回答 1查看 66关注 0票数 0

下面是我的xml

代码语言:javascript
复制
<div class="image">
<img  src="">
<div class="image-text"><p class="border_style">work </p></div>
</div>

我想获取class=“图像文本”中的所有内容。

输出

代码语言:javascript
复制
<p class="border_style">work </p>

我如何使用XPath来完成这个任务呢?或者其他方法?

我试过这个,

$image->xpath("*[@class='image-text']"),但没有起作用。

请指点

新的

代码语言:javascript
复制
$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
    ));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-11 16:25:53

使用你所拥有的XPath应该可以得到以下信息.

代码语言:javascript
复制
$imageText = $image->xpath("//*[@class='image-text']");
echo $imageText[0]->asXML().PHP_EOL;

给..。

代码语言:javascript
复制
<div class="image-text">
        <p class="border_style">work </p>
    </div>

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

如果您只想要内容,那么您必须从找到的子节点构建它.

代码语言:javascript
复制
$out = "";
foreach ( $imageText[0]->children() as $content )  {
    $out .= $content->asXML();
}
echo $out;

这只会给..。

代码语言:javascript
复制
<p class="border_style">work </p>

更新:

为了将其添加到代码中,我对其进行了一些重构,以便它开始查找外部标记(我认为使用称为块映像的类),然后遍历它。然后,它在这个元素中使用XPath来查找它的文本。

代码语言:javascript
复制
$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,然后删除标记可能更容易一些-

代码语言:javascript
复制
$out = $text[0]->asXML();

给你..。

代码语言:javascript
复制
<div class="block-image-text">
            <p class="border_style">work </p>
            aaaa
        </div>

您可能可以使用正则表达式来移除标记,但是我选择了简单的替换和切分string off方法的最后一部分.

代码语言:javascript
复制
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
    );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52280174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档