Skip to content

Instantly share code, notes, and snippets.

@pityonline
Created May 13, 2015 01:07
Show Gist options
  • Save pityonline/b30edf9742067d995ce0 to your computer and use it in GitHub Desktop.
Save pityonline/b30edf9742067d995ce0 to your computer and use it in GitHub Desktop.
xml_parse
#!/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,
},
},
};
<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