【发布时间】:2018-09-23 13:34:11
【问题描述】:
我有一个格式良好的 XML,我正在尝试使用 perl 模块 XML::Simple 将其转换为哈希。此文件中的某些部分无法正确解析。有什么方法(或解决方法)可以正确解析 xml 并获得所需的结果?
D:\tmp>perl parse_dns2.pl dns_problem_public.xml
Warning: <dns_entry> element has non-unique value in 'domain' key attribute:
0 at parse_dns2.pl line 9.
Warning: <dns_entry> element has non-unique value in 'domain' key attribute:
example.com at parse_dns2.pl line 9.
Warning: <dns_entry> element has non-unique value in 'domain' key attribute:
test.com at parse_dns2.pl line 9.
$VAR1 = {
'dns_timeout' => '20',
'local_dns' => {
'dns_entry' => {
'0' => {
'content' => '192.168.120.32'
},
'domain.example.com' => {
'content' => '172.16.113.13'
},
'example.com' => {
'content' => '172.16.113.13'
},
'test.com' => {
'content' => '172.17.0.113'
}
}
}
};
我的代码很简单:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use XML::Simple;
use Data::Dumper;
my $ref = XMLin(
$ARGV[0],
ForceArray => ['dns_entry'],
KeyAttr => { 'dns_entry' => 'priority' },
KeyAttr => { 'dns_entry' => 'domain' },
ForceContent => 0
);
print Dumper $ref;
xml 文件(相关部分)包含我需要用作键的属性:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE config SYSTEM "config.dtd">
<dns>
<local_dns>
<dns_entry priority="0">192.168.120.31</dns_entry>
<dns_entry priority="0">192.168.120.32</dns_entry>
<dns_entry domain="example.com">172.16.103.20</dns_entry>
<dns_entry domain="example.com">172.16.113.13</dns_entry>
<dns_entry domain="test.com">172.17.0.111</dns_entry>
<dns_entry domain="test.com">172.17.0.113</dns_entry>
<dns_entry domain="domain.example.com">172.16.103.20</dns_entry>
<dns_entry domain="domain.example.com">172.16.113.13</dns_entry>
</local_dns>
<dns_timeout>20</dns_timeout>
</dns>
XML::Simple 不能接受具有相同属性(尽管值不同)的相似元素的第一个问题。第二个问题是我只能使用 one 属性作为同一 XML 块中的关键属性。
想要的结果:
$VAR1 = {
'local_dns' => {
'dns_entry' => {
'domain' => {
'domain.example.com' => {
'content' => [
'172.16.113.20',
'172.16.113.13'
]
},
'example.com' => {
'content' => [
'172.16.113.20',
'172.16.113.13'
]
},
'test.com' => {
'content' => [
'172.17.0.111',
'172.17.0.111'
]
}
},
'priority' => {
'0' => {
'content' => [
'192.168.120.31',
'192.168.120.32'
]
}
}
}
},
'dns_timeout' => '20'
};
【问题讨论】:
-
Re "有什么方法(或解决方法)可以正确解析 xml 并获得所需的结果?",您没有指定所需的结果是什么.
-
@ikegami:谢谢,我已经添加了一个包含所需结果的部分。基本上是一个包含所有信息的散列,因此可以使用散列表达式来处理任何元素。
-
您确定这是您想要的结果吗?我的意思是,如果您使用
findnodes,您可以使用xpath表达式来处理任何元素,而您不必费心处理您的XML。如果您想重新How to Ask您的问题,并围绕更高层次的问题提出问题,我相信我们可以为您提供更好的答案。 -
@Sobrique:我将在我的 xml 文件的某些部分使用带有 findnodes 的 libxml。 libxml 的问题是我事先不知道 xml 文件的结构,而是需要“遍历”它。
-
我的意思是,您可能不需要需要知道文件的结构 - 正是您要查找的内容。如果你真的需要迭代它,你可以。但您可能也不需要这样做。
标签: xml perl xml-simple