Created
May 13, 2015 01:07
-
-
Save pityonline/b30edf9742067d995ce0 to your computer and use it in GitHub Desktop.
xml_parse
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
use strict; | |
use warnings; | |
use utf8; | |
use Smart::Comments; | |
use feature 'say'; | |
use XML::Simple; | |
binmode STDOUT, ":encoding(utf8)"; | |
my $xs = XML::Simple->new(); | |
my $ref = $xs->XMLin("report.xml", KeyAttr => 0, ForceArray => 0); | |
# my $subtitle = $ref->{NBChart}->{subtitle}; | |
my $header = $ref->{NBChart}->{'hearder-def'}; | |
my $header_series = $header->{'series-def'}->{series}; # array_ref | |
my $header_rows = $header->{'rows-def'}->{row}; # array_ref | |
my $header_cols = $header->{'cols-def'}->{col}; # array_ref | |
my $series = $ref->{NBChart}->{'chart-data'}->{serieses}->{series}; # array_ref | |
my %root; | |
my $task; | |
my $city; | |
my $key; | |
my $rows; | |
my $cols; | |
my $value; | |
my @keys; | |
my @values; | |
# 取出值 | |
sub get_values { | |
foreach (@$series) { | |
$rows = $_->{rows}->{row}; | |
foreach (@$rows) { | |
$cols = $_->{cols}->{col}; | |
foreach (@$cols) { | |
$value = $_->{value}; | |
push @values, $value; | |
} | |
return @values; # 返回有 6 个元素的数组 | |
} | |
} | |
} | |
# 取出 keys 并组织结构 | |
sub get_keys { | |
foreach (@$header_series) { # 任务名称 x 2 | |
$task = $_->{name}; | |
foreach (@$header_rows) { # 城市名称 x 15 | |
$city = $_->{name}; | |
@{$root{$task}{$city}}{@keys} = @values = get_values(); # 每次赋 6 个值给 keys | |
} | |
} | |
return %root; | |
} | |
foreach (@$header_cols) { # 数据项 x 6 | |
$key = $_->{name}; | |
push @keys, $key; | |
} | |
get_keys(); | |
### %root | |
__END__ | |
# DTD sample 1 | |
%root = { | |
任务_1 => { | |
北京 => { | |
性能 => 3.222, | |
可用性 => 97.0, | |
}, | |
广州 => { | |
性能 => 1.242, | |
可用性 => 99.0, | |
}, | |
}, | |
任务_2 => { | |
北京 => { | |
性能 => 2.222, | |
可用性 => 99.3, | |
}, | |
广州 => { | |
性能 => 4.212, | |
可用性 => 99.0, | |
}, | |
}, | |
任务_3 => { ... }, | |
任务_4 => { ... }, | |
}; | |
# DTD sample 2 | |
%root = { | |
series[1] => { # 监测任务 | |
row[1] => { # 监测城市 | |
col[1] => value, # 监测点数 | |
col[2] => value, # 成功点数 | |
col[3] => value, # 错误点数 | |
col[4] => value, # 排除点数 | |
col[5] => value, # 性能 | |
col[6] => value, # 可用性 | |
}, | |
row[2] => { | |
col[1] => value, | |
col[2] => value, | |
}, | |
}, | |
series[2] => { | |
row[1] => { | |
col[1] => value, | |
}, | |
row[2] => { | |
col[1] => value, | |
}, | |
}, | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<list> | |
<NBChart> | |
<title>datatable</title> | |
<subtitle>Time duration: 2015-05-11 15:20 - 2015-05-11- 18:20</subtitle> | |
<hearder-def> | |
<series-def> | |
<series name="task_aaa"/> | |
<series name="task_bbb"/> | |
</series-def> | |
<rows-def> | |
<row name="Wuhan"/> | |
<row name="Guiyang"/> | |
<row name="Shenyang"/> | |
<row name="Taiyuan"/> | |
<row name="Nanning"/> | |
<row name="Shijiazhuang"/> | |
<row name="Urumuqi"/> | |
<row name="Beijing"/> | |
<row name="Jinan"/> | |
<row name="Chongqing"/> | |
<row name="Xian"/> | |
<row name="Guangzhou"/> | |
<row name="Lanzhou"/> | |
<row name="Funzhou"/> | |
<row name="Shanghai"/> | |
</rows-def> | |
<cols-def> | |
<col name="Total"/> | |
<col name="Success"/> | |
<col name="Wrong"/> | |
<col name="Dropped"/> | |
<col name="Perf"/> | |
<col name="Avail"/> | |
</cols-def> | |
</hearder-def> | |
<chart-data> | |
<serieses> | |
<series> | |
<rows> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>7.966</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>7.57</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>4.273</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>3.924</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>3.422</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.997</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.855</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>4</value> | |
</col> | |
<col> | |
<value>4</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.49</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.319</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.212</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.087</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>4</value> | |
</col> | |
<col> | |
<value>1</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>1.639</value> | |
</col> | |
<col> | |
<value>80.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>1.017</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>1</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0.88</value> | |
</col> | |
<col> | |
<value>83.33</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>4</value> | |
</col> | |
<col> | |
<value>4</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0.773</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
</rows> | |
<sum-average-values> | |
<col aggregate="sum"> | |
<value>81.0</value> | |
</col> | |
<col aggregate="sum"> | |
<value>79.0</value> | |
</col> | |
<col aggregate="sum"> | |
<value>2.0</value> | |
</col> | |
<col aggregate="sum"> | |
<value>0.0</value> | |
</col> | |
<col aggregate="avg"> | |
<value>3.1821265822784817</value> | |
</col> | |
<col aggregate="avg"> | |
<value>97.53061728395062</value> | |
</col> | |
</sum-average-values> | |
</series> | |
<series> | |
<rows> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>1.672</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.041</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.898</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.442</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>5.791</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>1.14</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.486</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>3</value> | |
</col> | |
<col> | |
<value>3</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.258</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.151</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>1.355</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>1.206</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>4</value> | |
</col> | |
<col> | |
<value>1</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>1.458</value> | |
</col> | |
<col> | |
<value>80.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>6</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>9.594</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>4</value> | |
</col> | |
<col> | |
<value>1</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0.986</value> | |
</col> | |
<col> | |
<value>80.0</value> | |
</col> | |
</cols> | |
</row> | |
<row> | |
<cols> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>5</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>0</value> | |
</col> | |
<col> | |
<value>2.035</value> | |
</col> | |
<col> | |
<value>100.0</value> | |
</col> | |
</cols> | |
</row> | |
</rows> | |
<sum-average-values> | |
<col aggregate="sum"> | |
<value>80.0</value> | |
</col> | |
<col aggregate="sum"> | |
<value>78.0</value> | |
</col> | |
<col aggregate="sum"> | |
<value>2.0</value> | |
</col> | |
<col aggregate="sum"> | |
<value>0.0</value> | |
</col> | |
<col aggregate="avg"> | |
<value>2.738102564102564</value> | |
</col> | |
<col aggregate="avg"> | |
<value>97.5</value> | |
</col> | |
</sum-average-values> | |
</series> | |
</serieses> | |
</chart-data> | |
</NBChart> | |
</list> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment