如何基于子元素特定值提取XML父元素(Perl实现)
用Perl提取包含特定子元素值的XML父元素
当然可以用Perl结合你熟悉的XML::LibXML实现这个需求,以下是具体实现方案:
实现代码
use strict; use warnings; use XML::LibXML; # 解析XML(如果是字符串XML,替换为parse_string) my $parser = XML::LibXML->new(); my $doc = $parser->parse_file('input.xml'); # 通过XPath筛选出category值为mammal的row元素 my @target_rows = $doc->findnodes('/dataset/row[category/text()="mammal"]'); # 构建新的XML文档结构 my $new_doc = XML::LibXML::Document->new('1.0', 'UTF-8'); my $new_dataset = $new_doc->createElement('dataset'); $new_doc->setDocumentElement($new_dataset); # 将筛选出的row元素复制到新文档中 foreach my $row (@target_rows) { $new_dataset->appendChild($row->cloneNode(1)); # 深拷贝包含子元素 } # 输出格式化后的结果 print $new_doc->toString(1);
代码说明
- 解析XML:使用
XML::LibXML的parse_file解析本地XML文件,若处理字符串形式的XML,改用parse_string即可。 - XPath筛选:利用XPath表达式
/dataset/row[category/text()="mammal"]精准定位所有符合条件的row父元素,该表达式表示查找dataset下、子元素category文本值为mammal的row节点。 - 构建新文档:创建新的XML文档和根节点
dataset,将筛选出的row节点通过深拷贝(cloneNode(1))添加到新根节点中,保留原节点的所有子元素结构。 - 输出结果:
toString(1)会输出带缩进的格式化XML,与你预期的结果完全一致。
运行结果
执行上述代码后,输出的XML内容如下:
<?xml version="1.0" encoding="UTF-8"?> <dataset> <row> <name>racoon</name> <category>mammal</category> </row> <row> <name>horse</name> <category>mammal</category> </row> </dataset>
内容的提问来源于stack exchange,提问作者giordano
相关产品推荐
相关产品推荐

