如何使用 Perl LibXML::XML 生成一元 XML 标记
How to generate an unary XML tag with Perl LibXML::XML
我有一个 XML 模板,看起来像这样(摘录):
<isSomething>_xxx_</isSomething>
<someValue>_xxx_</someValue>
我的代码遍历模板并分别使用 XML::LibXML 的 findnode 和 setData 方法替换 _xxx_ 占位符。
最后是这样的:
<isSomething>true</isSomething>
<someValue>123.45</someValue>
这样就可以了,但是如果 isSomething 标签看起来像这样,如果它是真的,接收系统会更高兴:
<isSomething/>
如果它是假的,将被完全省略。
有没有办法用 XML::LibXML 做到这一点,或者我应该在字符串输出上应用强大的正则表达式?
所以首先 - 请不要使用正则表达式 XML。这个不干净。 RegEx match open tags except XHTML self-contained tags
我想你会想要的是 LibXML::XML::Element
- 特别是:
new
$node = XML::LibXML::Element->new( $name );
This function creates a new node unbound to any DOM.
其次是:
$node->replaceNode($newNode);
要删除节点,请使用 removeChild
。要生成空元素,请移除其文本子项:
#! /usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
my $xml = 'XML::LibXML'->load_xml( string => << '__XML__');
<root>
<node id="a">
<isSomething>_xxx_</isSomething>
<someValue>_xxx_</someValue>
</node>
<node id="b">
<isSomething>_xxx_</isSomething>
<someValue>_xxx_</someValue>
</node>
</root>
__XML__
my %nodes = ( a => [ 'true', 1 ],
b => [ 'false', 2 ],
);
for my $node ($xml->documentElement->findnodes('//node')) {
my $id = $node->{id};
my ($is_something, $value) = @{ $nodes{$id} };
my ($s) = $node->findnodes('isSomething[.="_xxx_"]');
if ('true' eq $is_something) {
my ($text) = $s->findnodes('text()');
$s->removeChild($text);
} else {
$node->removeChild($s);
}
my ($v) = $node->findnodes('someValue/text()[.="_xxx_"]');
$v->setData($value);
}
print $xml;
我有一个 XML 模板,看起来像这样(摘录):
<isSomething>_xxx_</isSomething>
<someValue>_xxx_</someValue>
我的代码遍历模板并分别使用 XML::LibXML 的 findnode 和 setData 方法替换 _xxx_ 占位符。
最后是这样的:
<isSomething>true</isSomething>
<someValue>123.45</someValue>
这样就可以了,但是如果 isSomething 标签看起来像这样,如果它是真的,接收系统会更高兴:
<isSomething/>
如果它是假的,将被完全省略。 有没有办法用 XML::LibXML 做到这一点,或者我应该在字符串输出上应用强大的正则表达式?
所以首先 - 请不要使用正则表达式 XML。这个不干净。 RegEx match open tags except XHTML self-contained tags
我想你会想要的是 LibXML::XML::Element
- 特别是:
new
$node = XML::LibXML::Element->new( $name );
This function creates a new node unbound to any DOM.
其次是:
$node->replaceNode($newNode);
要删除节点,请使用 removeChild
。要生成空元素,请移除其文本子项:
#! /usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
my $xml = 'XML::LibXML'->load_xml( string => << '__XML__');
<root>
<node id="a">
<isSomething>_xxx_</isSomething>
<someValue>_xxx_</someValue>
</node>
<node id="b">
<isSomething>_xxx_</isSomething>
<someValue>_xxx_</someValue>
</node>
</root>
__XML__
my %nodes = ( a => [ 'true', 1 ],
b => [ 'false', 2 ],
);
for my $node ($xml->documentElement->findnodes('//node')) {
my $id = $node->{id};
my ($is_something, $value) = @{ $nodes{$id} };
my ($s) = $node->findnodes('isSomething[.="_xxx_"]');
if ('true' eq $is_something) {
my ($text) = $s->findnodes('text()');
$s->removeChild($text);
} else {
$node->removeChild($s);
}
my ($v) = $node->findnodes('someValue/text()[.="_xxx_"]');
$v->setData($value);
}
print $xml;