xml – 列出document元素的所有子节点
发布时间:2020-12-16 05:36:00 所属栏目:百科 来源:网络整理
导读:我有一个非常庞大的 XML文件,我想列出文档元素的所有子节点. 我正在使用下面的代码工作正常,但它需要很长时间来处理文件,它也从文档元素获取数据,这是不需要的: use XML::Simple;my $xml = XML::Simple-new();my $d = $xml-XMLin("sample.xml");my @arr = k
我有一个非常庞大的
XML文件,我想列出文档元素的所有子节点.
我正在使用下面的代码工作正常,但它需要很长时间来处理文件,它也从文档元素获取数据,这是不需要的: use XML::Simple; my $xml = XML::Simple->new(); my $d = $xml->XMLin("sample.xml"); my @arr = keys %$d; print "@arrn"; 示例XML: <?xml version="1.0" encoding="ISO-8859-15"?> <document version="1.0" createdAt="2017-03-31T11:41:34"> <TITLE>Computer Parts</TITLE> <PART001> <ITEM>Motherboard</ITEM> <MANUFACTURER>ASUS</MANUFACTURER> <MODEL>P3B-F</MODEL> <COST> 123.00</COST> </PART001> <PART002> <ITEM>Video Card</ITEM> <MANUFACTURER>ATI</MANUFACTURER> <MODEL>All-in-Wonder Pro</MODEL> <COST> 160.00</COST> </PART002> <PART003> <ITEM>Sound Card</ITEM> <MANUFACTURER>Creative Labs</MANUFACTURER> <MODEL>Sound Blaster Live</MODEL> <COST> 80.00</COST> </PART003> <PART004> <ITEM>14 inch Monitor</ITEM> <MANUFACTURER>LG Electronics</MANUFACTURER> <MODEL> 995E</MODEL> <COST> 290.00</COST> </PART004> </document> 预期产出: 任何人都可以建议更快更好的方法来获得所需的输出?
通过使用
XML::LibXML和XPath.
use 5.014; use warnings; use XML::LibXML; my $file = 'xml'; my $dom = XML::LibXML->load_xml(location => $file); for my $child ($dom->findnodes( q{//document/*} )) { say $child->nodeName(); } 产量 TITLE PART001 PART002 PART003 PART004 或者只是为了这个案例,如果你只需要PARTs for my $part ($dom->findnodes( q{//*[contains(name(),'PART')]} )) { say $part->nodeName(); } 产量 PART001 PART002 PART003 PART004 编辑:使用拉解析器(不会将整个xml加载到内存中): use 5.014; use warnings; use XML::LibXML::Reader qw(XML_READER_TYPE_ELEMENT); my $file="xml"; my $reader = XML::LibXML::Reader->new(location => $file) or die "problem $!"; while($reader->read()) { if( $reader->depth == 1 && $reader->nodeType == XML_READER_TYPE_ELEMENT ) { say $reader->name; } } TITLE PART001 PART002 PART003 PART004 EDIT2 use 5.014; use warnings; use XML::LibXML::Reader qw(XML_READER_TYPE_ELEMENT); my $file="xml"; my $reader = XML::LibXML::Reader->new(location => $file) or die "problem $!"; my $indoc; while($reader->read()) { # sets the flag in youre inside the <document> if( $reader->name eq 'document' ) { $indoc = $reader->nodeType == XML_READER_TYPE_ELEMENT ? 1 : 0; } # all nodes with level 1 if they're inside of the <document> if( $indoc && $reader->depth == 1 && $reader->nodeType == XML_READER_TYPE_ELEMENT ) { say $reader->name; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |