XML::Simple 和命名空间
XML::Simple and namespaces
注意: 问题已解决,但请阅读下面池上的回复。非常有用,尤其是关于避免 XML::Simple.
的 link
我刚开始与一家广泛使用 XML::Simple 的公司合作,我们现在遇到了解析问题。
这是一个示例 XML 文件...(注意第一部分已注释掉)
<xyz:CostFee>
<ec:OPA>25.00</ec:OPA>
<ec:CTID>278421</ec:CTID>
<xyz:CDEPSID>82</xyz:CDEPSID>
<ec:IID>8765654</ec:IID>
</xyz:CostFee>
我正在使用这个简单的 perl 脚本....
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
my $content = XMLin('./data.xml');
print Dumper($content);
运行 脚本产生这个.....
Undeclared prefix: xyz at /System/Library/Perl/Extras/5.18/XML/NamespaceSupport.pm line 298.
XML::Simple called at ./xml_test.pl line 6.
当我在 XML 文件中使用它时...
<catalog>
<part partnum="184324" desc="Desc 1" price="19.00" />
<part partnum="765398" desc="Desc 2" price="18.00" />
<part partnum="878998" desc="Desc 3" price="15.00"/>
</catalog>
它工作得很好,Dumper 很高兴地把它扔掉了......
由于我们讨论的是遗留程序并且不需要替换 XML::Simple(但老实说,我认为您不能在 XML::Simple 中注册名称空间,但我绝不是专家 ).
任何人都可以用一两个指针指出我正确的方向吗?我认为将名称空间信息作为 XML 内容的一部分可能是可行的方法,例如......
<xsl:stylesheet version="1.0" xmlns:xsl="https://www.w3.org/1999/XSL/Transform">
非常感谢 JW
该节点必须是具有以下属性的节点的子节点:
xmlns:xyz="..."
(尽你所能 ,如果你有无效的 XML,更改解析器将无法工作。)
例如,改变
<doc>
<xyz:CostFee>
<ec:OPA>25.00</ec:OPA>
<ec:CTID>278421</ec:CID>
<xyz:CDEPSID>82</xyz:CDEPSID>
<ec:IID>8765654</ec:IID>
</xyz:CostFee>
</doc>
到
<doc xmlns:xyz="..." xmlns:ec="...">
<xyz:CostFee>
<ec:OPA>25.00</ec:OPA>
<ec:CTID>278421</ec:CTID>
<xyz:CDEPSID>82</xyz:CDEPSID>
<ec:IID>8765654</ec:IID>
</xyz:CostFee>
</doc>
允许解析文档。 (注意前缀声明的添加,以及从 </ec:CTID>
到 </ec:CID>
的更改。使用正确的 URN 而不是 ...
。)
一行修复....
只需设置
$XML::Simple::PREFERRED_PARSER = "XML::Parser".
在调用 XMLin 之前。
注意: 问题已解决,但请阅读下面池上的回复。非常有用,尤其是关于避免 XML::Simple.
的 link我刚开始与一家广泛使用 XML::Simple 的公司合作,我们现在遇到了解析问题。
这是一个示例 XML 文件...(注意第一部分已注释掉)
<xyz:CostFee>
<ec:OPA>25.00</ec:OPA>
<ec:CTID>278421</ec:CTID>
<xyz:CDEPSID>82</xyz:CDEPSID>
<ec:IID>8765654</ec:IID>
</xyz:CostFee>
我正在使用这个简单的 perl 脚本....
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
my $content = XMLin('./data.xml');
print Dumper($content);
运行 脚本产生这个.....
Undeclared prefix: xyz at /System/Library/Perl/Extras/5.18/XML/NamespaceSupport.pm line 298.
XML::Simple called at ./xml_test.pl line 6.
当我在 XML 文件中使用它时...
<catalog>
<part partnum="184324" desc="Desc 1" price="19.00" />
<part partnum="765398" desc="Desc 2" price="18.00" />
<part partnum="878998" desc="Desc 3" price="15.00"/>
</catalog>
它工作得很好,Dumper 很高兴地把它扔掉了......
由于我们讨论的是遗留程序并且不需要替换 XML::Simple(但老实说,我认为您不能在 XML::Simple 中注册名称空间,但我绝不是专家 ).
任何人都可以用一两个指针指出我正确的方向吗?我认为将名称空间信息作为 XML 内容的一部分可能是可行的方法,例如......
<xsl:stylesheet version="1.0" xmlns:xsl="https://www.w3.org/1999/XSL/Transform">
非常感谢 JW
该节点必须是具有以下属性的节点的子节点:
xmlns:xyz="..."
(尽你所能
例如,改变
<doc>
<xyz:CostFee>
<ec:OPA>25.00</ec:OPA>
<ec:CTID>278421</ec:CID>
<xyz:CDEPSID>82</xyz:CDEPSID>
<ec:IID>8765654</ec:IID>
</xyz:CostFee>
</doc>
到
<doc xmlns:xyz="..." xmlns:ec="...">
<xyz:CostFee>
<ec:OPA>25.00</ec:OPA>
<ec:CTID>278421</ec:CTID>
<xyz:CDEPSID>82</xyz:CDEPSID>
<ec:IID>8765654</ec:IID>
</xyz:CostFee>
</doc>
允许解析文档。 (注意前缀声明的添加,以及从 </ec:CTID>
到 </ec:CID>
的更改。使用正确的 URN 而不是 ...
。)
一行修复.... 只需设置
$XML::Simple::PREFERRED_PARSER = "XML::Parser".
在调用 XMLin 之前。