隨着使用set_text
方法XML::Twig
set_text - 有一個警告:XML ::嫩枝 - 沒有重挫結構
set_text($字符串) 設置文本的元素:如果元素是PCDATA,只需設置其文本,否則剪切該元素的所有子元素併爲其創建一個包含文本的PCDATA子元素。
所以,如果我想要做簡單的東西,比如 - 說 - 在我的XML改變所有文本的情況下::文件:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new(
'pretty_print' => 'indented_a',
'twig_handlers' => {
'_all_' => sub {
my $newtext = $_->text_only;
$newtext =~ tr/[a-z]/[A-Z]/;
$_->set_text($newtext);
}
}
);
$twig->parse(\*DATA);
$twig->print;
__DATA__
<root>
<some_content>fish
<a_subnode>morefish</a_subnode>
</some_content>
<some_more_content>cabbage</some_more_content>
</root>
這一點 - 因爲set_text
代替孩子 - 被打一頓成:
<root></root>
但如果我只專注於一個(底層)節點(例如a_subnode
),那麼它工作正常。
有沒有一種優雅的方式來替換/轉換元素內的文本,而不會破壞它下面的數據結構?我的意思是,我可以測試孩子的存在或類似的東西,但是...似乎應該有一個更好的方法來做到這一點。 (一個不同的庫可能?)
(爲了清楚起見 - 這是我在文檔中音譯所有文本的示例,我的實際使用案例更加複雜,但仍在'關於'文本改造的探討)。我正在考慮可能是節點剪切/粘貼方法(剪切所有的孩子,替換文本,粘貼所有的孩子),但這似乎是一種低效率的方法。
測試是否有孩子聽起來像一個好主意。 – simbabque