XML::Simple 和命名空间

XML::Simple and namespaces

提问人:Jane Wilkie 提问时间:1/10/2020 最后编辑:Jane Wilkie 更新时间:1/10/2020 访问量:288

问:

注意:问题已解决,但请阅读下面的池上回复。信息量很大,尤其是关于避免 XML::Simple 的链接。

我刚刚开始与一家广泛使用 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

xml perl xml 解析

评论

1赞 Gilles Quénot 1/10/2020
当您具有 .请提供有效的 XMLfoo:bar

答:

2赞 ikegami 1/10/2020 #1

该节点必须是具有以下属性的节点的子节点:

xmlns:xyz="..."

(尽管您应该避免使用 XML::Simple,但如果 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>

允许对文档进行解析。(请注意添加前缀声明,以及从 更改为 。使用正确的 URN 而不是 。</ec:CTID></ec:CID>...

评论

0赞 Jane Wilkie 1/10/2020
我的解决方案是在后端使用 XML::P arser 而不是 XML::Sax,这解决了我的问题。您提供的关于避免 XML::Simple 的链接信息量很大,我计划以此为理由完全摆脱它。我非常感谢你池上。JW公司
1赞 ikegami 1/10/2020
XML::Simple+XML::P arser 组合不知道命名空间,因此将该组合用于使用命名空间的文档是没有意义的。您必须对前缀而不是命名空间进行硬编码,这是一个很大的禁忌。人们应该知道元素的命名空间,而不是使用什么前缀(如果有的话)来指示元素的命名空间。用于前缀的 id 毫无意义,文档之间可以不同,而不会影响架构合规性。
1赞 ikegami 1/10/2020
例如,和 是等效文档,但 XML::Simple+XML::P arser 以不同的方式解析。<d xmlns="x"><e/></d><d foo:xmlns="x"><foo:e/></d><d bar:xmlns="x"><bar:e/></d>
0赞 Jane Wilkie 1/10/2020
好的,如果 XML::Simple+XML::Sax 和 XML::Simple+XML::P arser 都表现出命名空间问题,那么 XML::LibXML 使用什么才能如此成功?只是想理解
1赞 ikegami 1/11/2020
[摘要]XML::Simple+XML::SAX with 不会出现命名空间问题。当然,您仍然有使用 XML::Simple 的所有其他问题。通过该设置,您可以根据需要使用命名空间而不是前缀。您问的问题不是命名空间问题;它是无效的 XML。NSExpand => 1
1赞 Jane Wilkie 1/10/2020 #2

一行修复.... 只需将

$XML::Simple::PREFERRED_PARSER = "XML::Parser".

在调用 XMLin 之前。