XML 文档解析
XML document parsing
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<DataElement>
<Serial_Start>1000</Serial_Start>
<Serial_End>2000</Serial_End>
<Item value="257896">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="523698">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="856987">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
</Item>
</DataElement>
<DataElement>
<Serial_Start></Serial_Start>
<Serial_End></Serial_End>
<Item value="123456">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="123456">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="123456">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
</DataElement>
</Document>
我是 PERL 的新手,正在尝试解析上述 XML 文档。我
要求以下面提到的格式输出。
Serial Start : 1000
Serial End : 2000
Item : 257896
Price : 00
Sku : 20
Qcode : 27
Item : 257896
Price : 80
Sku : 20
Qcode : 20
...每个子节点依此类推。
到目前为止的示例代码:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml = new XML::Simple;
my $data = $xml->XMLin("/home/rocky/PERL/doc.xml");
print Dumper($data);
foreach my $imgrec ( @{ $data->{DataElement} } ) {
my $Serial_Start = $imgrec->{Serial_Start};
my $Serial_End = $imgrec->{Serial_End};
foreach my $imgrec1 ( @{ $data->{DataElement}->{Item} } ) {
## Not sure of this code
## Trying on this part.
}
}
好的,这是你的问题:
use XML::Simple;
不要 - 它只会让你的生活更加艰难。
这是一个使用 XML::Twig
的 10 人的启动器 - 还不完全清楚你正在做什么来获得你想要的输出,所以:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig-> new -> parsefile('/home/rocky/PERL/doc.xml')
foreach my $data_element ( $twig->findnodes('//DataElement') ) {
print "Start:", $data_element->first_child_text('Serial_Start'), "\n";
print "End:", $data_element->first_child_text('Serial_End'), "\n";
foreach my $item ( $data_element -> children('Item') ){
print "Item: ", $item -> att('value'),"\n";
foreach my $tag ( qw ( Price Sku Qcode ) ) {
print "$tag: ", $item -> findnodes (".//$tag", 0 ) -> text,"\n";
}
}
}
注意 - 这会找到项目下方特定标签的 第一个 实例 - 不是所有实例。
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<DataElement>
<Serial_Start>1000</Serial_Start>
<Serial_End>2000</Serial_End>
<Item value="257896">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="523698">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="856987">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
</Item>
</DataElement>
<DataElement>
<Serial_Start></Serial_Start>
<Serial_End></Serial_End>
<Item value="123456">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="123456">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
<Item value="123456">
<ComItemation>
<Price>00</Price>
<Sku>20</Sku>
<Qcode>27</Qcode>
</ComItemation>
<ComItemation>
<Price>80</Price>
<Sku>20</Sku>
<Qcode>20</Qcode>
</ComItemation>
</Item>
</DataElement>
</Document>
我是 PERL 的新手,正在尝试解析上述 XML 文档。我 要求以下面提到的格式输出。
Serial Start : 1000
Serial End : 2000
Item : 257896
Price : 00
Sku : 20
Qcode : 27
Item : 257896
Price : 80
Sku : 20
Qcode : 20
...每个子节点依此类推。
到目前为止的示例代码:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml = new XML::Simple;
my $data = $xml->XMLin("/home/rocky/PERL/doc.xml");
print Dumper($data);
foreach my $imgrec ( @{ $data->{DataElement} } ) {
my $Serial_Start = $imgrec->{Serial_Start};
my $Serial_End = $imgrec->{Serial_End};
foreach my $imgrec1 ( @{ $data->{DataElement}->{Item} } ) {
## Not sure of this code
## Trying on this part.
}
}
好的,这是你的问题:
use XML::Simple;
不要 - 它只会让你的生活更加艰难。
这是一个使用 XML::Twig
的 10 人的启动器 - 还不完全清楚你正在做什么来获得你想要的输出,所以:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig-> new -> parsefile('/home/rocky/PERL/doc.xml')
foreach my $data_element ( $twig->findnodes('//DataElement') ) {
print "Start:", $data_element->first_child_text('Serial_Start'), "\n";
print "End:", $data_element->first_child_text('Serial_End'), "\n";
foreach my $item ( $data_element -> children('Item') ){
print "Item: ", $item -> att('value'),"\n";
foreach my $tag ( qw ( Price Sku Qcode ) ) {
print "$tag: ", $item -> findnodes (".//$tag", 0 ) -> text,"\n";
}
}
}
注意 - 这会找到项目下方特定标签的 第一个 实例 - 不是所有实例。