【问题标题】:Add new class to an element using XML::LibXML使用 XML::LibXML 向元素添加新类
【发布时间】:2020-05-16 01:59:45
【问题描述】:

我有一个简单的 HTML sn-p 如下:

<div class="out"><p class="a">This is a paragraph. <p class="b">another</p></p></div>

我需要在外部 p 元素中添加一个新类 b,从而产生以下预期结果:

<div class="out"><p class="a b">This is a paragraph. <p class="b">another</p></p></div>

内部的p 元素应该保持不变。

这可能吗?

【问题讨论】:

  • (1) ""outer p element" 是指div 正下方的那个吗 (2) 是否"添加一个新类" 表示如果class 属性存在,则添加到它所具有的任何内容。或者...?
  • (1)是的。 (2)如果class属性不存在,则添加;否则将新类 b 附加到现有的 class 属性中。

标签: perl xml-libxml


【解决方案1】:

找到正确的元素并使用setAttribute方法更改其属性。

以下代码使用注释中阐明的要求:感兴趣的段落是div 下方的第一个段落,如果存在或创建其属性class,则需要附加。

use warnings;
use strict;
use feature 'say';

use XML::LibXML;

my $xml = q(<div class="out"><p class="a">This is a paragraph. )
        . q(<p class="b">another</p></p></div>);  #/

my $doc = XML::LibXML->load_xml(string => $xml);

my @nodes = $doc->findnodes('//p');

for my $node (@nodes) { 
    if ($node->parentNode->nodeName eq 'div') {
        my $attr_val = $node->getAttribute('class');
        $node->setAttribute(
            class => ($attr_val ? "$attr_val " : '') . 'b'
        );
    }   
}

say $doc;

这仍然假设p 没有同级段落(因此直接在同一个div 下),或者如果确实如此,它们也应该以相同的方式进行更改。如果不是这种情况,那么应该识别所有这些兄弟姐妹并跳过它们。

首先搜索p,然后检查节点的父节点,以防一些细微的细化潜入(“是的,div 下的p,但边缘除外...”的情况)。但是,如果这不是问题并且严格来说是div 下的p,那么最好直接这样做

my @nodes = $doc->findnodes('//div/p');

然后附加到class 属性或以与上述相同的方式创建它。

以上印刷品

<?xml version="1.0"?>
<div class="out"><p class="a b">This is a paragraph. <p class="b">another</p></p></div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多