如何验证在任何元素中都包含符号的XML文档而不出现异常?

如何验证在任何元素中都包含符号的XML文档而不出现异常?,xml,perl,validation,Xml,Perl,Validation,我有一个不可编辑的XML文件,其中有一些不需要的标记,所以当我使用XML::Simple验证XML文档时,会出现一个异常。这是意料之中的 my $xml = new XML::Simple(); if (eval { $xml->parse("sample.xml") }) { print "success!!\n"; } else { print "failed!!!\n"; } 但是,解析器还在XML文档的URL中抛出符号的异常。预期的结果是XML主体内的符号不应

我有一个不可编辑的XML文件,其中有一些不需要的标记,所以当我使用XML::Simple验证XML文档时,会出现一个异常。这是意料之中的

my $xml = new XML::Simple(); 
if (eval { $xml->parse("sample.xml") }) {
    print "success!!\n";
} else {
    print "failed!!!\n";
} 

但是,解析器还在XML文档的URL中抛出符号的异常。预期的结果是XML主体内的符号不应导致抛出错误。如何使用XML::Simple或任何其他XML解析器模块克服这一问题?我尝试了XML::Simple、XML::LibXML和XML::Mini::Document。没有一个成功地解决了符号问题。

正确的术语是检查文档是否与XML文档的定义匹配,而不是是否与XML文档的定义和架构的定义匹配。您可以使用来验证文档

也就是说,听起来你的支票工作正常。您提供的不是格式良好的XML,解析器告诉您这一点

这不是格式良好的XML:

<ele url="http://www.example.org/form?foo=bar&moo=mar"/>
<ele>http://www.example.org/form?foo=bar&moo=mar</ele>
应该是

<ele url="http://www.example.org/form?foo=bar&amp;moo=mar"/>
<ele>http://www.example.org/form?foo=bar&amp;moo=mar</ele>
这不是格式良好的XML:

<ele url="http://www.example.org/form?foo=bar&moo=mar"/>
<ele>http://www.example.org/form?foo=bar&moo=mar</ele>
应该是

<ele url="http://www.example.org/form?foo=bar&amp;moo=mar"/>
<ele>http://www.example.org/form?foo=bar&amp;moo=mar</ele>

正确的术语是检查文档是否匹配XML文档的定义,而不是检查文档是否匹配XML文档的定义和模式的定义。您可以使用来验证文档

也就是说,听起来你的支票工作正常。您提供的不是格式良好的XML,解析器告诉您这一点

这不是格式良好的XML:

<ele url="http://www.example.org/form?foo=bar&moo=mar"/>
<ele>http://www.example.org/form?foo=bar&moo=mar</ele>
应该是

<ele url="http://www.example.org/form?foo=bar&amp;moo=mar"/>
<ele>http://www.example.org/form?foo=bar&amp;moo=mar</ele>
这不是格式良好的XML:

<ele url="http://www.example.org/form?foo=bar&moo=mar"/>
<ele>http://www.example.org/form?foo=bar&moo=mar</ele>
应该是

<ele url="http://www.example.org/form?foo=bar&amp;moo=mar"/>
<ele>http://www.example.org/form?foo=bar&amp;moo=mar</ele>

您没有XML文件。解析器告诉您它不是XML文件。如果要使用非XML文件,请不要尝试使用XML工具处理它们


如果文件的发起者声称它是XML,告诉他们他们向您发送了一个错误的文件,并要求修复它,或者切换到更可靠的供应商。如果你下载了一个自称是Java的程序,但它没有编译,你会怎么做?

你没有XML文件。解析器告诉您它不是XML文件。如果要使用非XML文件,请不要尝试使用XML工具处理它们

如果文件的发起者声称它是XML,告诉他们他们向您发送了一个错误的文件,并要求修复它,或者切换到更可靠的供应商。如果你下载了一个自称是Java的程序,但它没有编译,你会怎么做?

你可能可以,它会很乐意接受这种破碎的XML。它还可能以其他方式破坏您的XML,所以买家要当心

因为它是XML::LibXML的子类,所以可以使用它来代替XML::LibXML,但我不会这样做。我会先将准XML转换为正确的XML,然后检查它,然后使用常规的XML工具进行其余的处理(可能不是XML::Simple),请参见模块文档中的警告

转换器可以简单到:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Liberal;

my $parser = XML::Liberal->new('LibXML');
my $doc = $parser->parse_file( 'broken_xml.xml');

print $doc->toString;
认识到这是一个危险的解决方案,使用一个处于alpha状态且6年未接触过的模块。因此,它绝对不能用作生产系统的一部分

真正的解决方案是使输入成为真正的格式良好的XML。这是可能的,裸URL和in URL可以替换为&;或;,但是您应该使用HTML工具,而不是XML工具。或者让你的提供者羞于向你发送真正的XML

同时,XML::Liberal可能是临时解决方案的一部分

您可能能够,这将很乐意接受这种破碎的XML。它还可能以其他方式破坏您的XML,所以买家要当心

因为它是XML::LibXML的子类,所以可以使用它来代替XML::LibXML,但我不会这样做。我会先将准XML转换为正确的XML,然后检查它,然后使用常规的XML工具进行其余的处理(可能不是XML::Simple),请参见模块文档中的警告

转换器可以简单到:

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Liberal;

my $parser = XML::Liberal->new('LibXML');
my $doc = $parser->parse_file( 'broken_xml.xml');

print $doc->toString;
认识到这是一个危险的解决方案,使用一个处于alpha状态且6年未接触过的模块。因此,它绝对不能用作生产系统的一部分

真正的解决方案是使输入成为真正的格式良好的XML。这是可能的,裸URL和in URL可以替换为&;或;,但是您应该使用HTML工具,而不是XML工具。或者让你的提供者羞于向你发送真正的XML

同时,XML::Liberal可能是临时解决方案的一部分

我有一个不可编辑的XML文件

实际上,没有。您没有XML文件。有些东西几乎是XML文件,但并不完全是XML文件。一个格式良好的XML文档不包含除作为实体开头的符号以外的符号,而这些符号不是。格式良好的XML文档中的符号应编码为& amp

我想你有三个选择:

回到这个非XML文档的源代码,让他们向您发送格式良好的XML。如果这是由外部供应商提供的,很可能有合同规定他们将向您提供XML。如果是这样,他们就是违约。 预分析文档以更正符号的编码。这可能是易碎品,我不推荐。 使用类似XML::Liberal的东西来解析文档。我不建议这样做,因为一旦允许使用非标准XML,就会出现一个滑坡,导致我们在20世纪90年代在HTML解析器中看到的混乱局面:- 如果由我决定,我肯定会选择第一个

我有一个不可编辑的XML文件

实际上,没有。您没有XML文件。有些东西几乎是XML文件,但并不完全是XML文件。一个格式良好的XML文档不包含除作为实体开头的符号以外的符号,而这些符号不是。格式良好的XML文档中的符号应编码为&

我想你有三个选择:

回到这个非XML文档的源代码,让他们向您发送格式良好的XML。如果这是由外部供应商提供的,很可能有合同规定他们将向您提供XML。如果是这样,他们就是违约。 预分析文档以更正符号的编码。这可能是易碎品,我不推荐。 使用类似XML::Liberal的东西来解析文档。我不建议这样做,因为一旦允许使用非标准XML,就会出现一个滑坡,导致我们在20世纪90年代在HTML解析器中看到的混乱局面:-
如果由我决定,我肯定会选择第一个选项。

Re我如何才能成功验证任何xml标记中包含符号AND的xml,除非符号AND是已定义实体的一部分,否则这是不允许的,听起来一切正常。除了使用XML解析器解析格式不正确的XML文档的问题外,使用XML::Simple还带来了另一个问题。在中,模块作者说,请不要在新代码中使用此模块,强烈反对在新代码中使用此模块。请不要忽视他的建议。我们如何才能成功验证在任何xml标记中包含符号AND的xml,除非符号AND是已定义实体的一部分,否则这是不允许的,因此听起来一切都正常工作。除了使用xml解析器解析格式不正确的xml文档的问题,使用XML::Simple会给自己带来另一个问题。在中,模块作者说,请不要在新代码中使用此模块,强烈反对在新代码中使用此模块。请不要忽略他的建议。好的,没有Perl XML模块,我可以使用它隐式地告诉您,如果遇到了与,则忽略它。这样的解析器将有缺陷。如果它作为XML解析器销售,则会有缺陷。如果将其作为修复格式错误的XML的工具进行销售,那将是另一回事……@Michael Kay,1 OP要求提供XML解析器/验证器。2 OP没有要求任何东西修理。3这样的工具如何修理和修复?它是一个缺少的分号或一个未被替换的&?1他们问我如何才能不限制解决方案,2编写修复工具与编写解析器是完全不同的艺术。答案是,你猜,然后问题是你的猜测有多聪明。例如,您可以考虑名为foo的实体是否实际存在。但关键的信息是,虽然您可以通过这种方式恢复大量损坏的数据,但最好首先坚持获取干净的数据,而不是修复混乱的数据。好的,因此,没有一个Perl XML模块,我可以使用它隐式地告诉用户,如果遇到了符号,就可以忽略它。这样的解析器是有缺陷的。如果它以XML解析器的形式销售,那就是有缺陷的。如果将其作为修复格式错误的XML的工具进行销售,那将是另一回事……@Michael Kay,1 OP要求提供XML解析器/验证器。2 OP没有要求任何东西修理。3这样的工具如何修理和修复?它是一个缺少的分号或一个未被替换的&?1他们问我如何才能不限制解决方案,2编写修复工具与编写解析器是完全不同的艺术。答案是,你猜,然后问题是你的猜测有多聪明。例如,您可以考虑名为foo的实体是否实际存在。但关键的信息是,虽然您可以通过这种方式恢复大量损坏的数据,但最好首先坚持获取干净的数据,而不是修复混乱的数据。是的,Dave,您是对的,我有这个XML文件,而不是将其称为扩展名为.XML的文件:在clear case vob中,我没有签出/签入访问权限。谢谢你的评论。@Kalesh:那么你
eed将文件跟踪到其源。它是从哪里来的?是谁创造的?有人会有能力为你解决这个问题。你只需要知道是谁。是的,Dave,你是对的,我有这个XML文件,我宁愿把它称为扩展名为.XML的文件:在一个清晰的案例vob中,我没有签出/签入权限。谢谢你的评论。@Kalesh:所以你需要追踪文件的来源。它是从哪里来的?是谁创造的?有人会有能力为你解决这个问题。你只需要知道是谁。我在clearcase vob中得到的文件的扩展名是.xml,文件中有一个标记描述,文本为https/blahblah.blah.com/isynch.dll?panel=ModuleConfig&Type=ModuleView&Module。我不知道clearcase vob是什么,但尽管它的文件扩展名是XML,但它不是XML,对你来说,它就像一辆有舒适座椅、四个轮子、前灯上有闪亮装饰、没有起动马达的汽车一样有用。发回并投诉。@MichaelKay:ClearCase是一个版本控制系统,VOB是版本化的对象库,这是它用来存储版本信息的机制。我在ClearCase VOB中得到的文件扩展名是.xml,文件中有一个标记描述,文本为https/blahblah.blah.com/isynch.dll?panel=ModuleConfig&Type=ModuleView&Module。我不知道clearcase vob是什么,但尽管它的文件扩展名是XML,但它不是XML,对你来说,它就像一辆有舒适座椅、四个轮子、前灯上有闪亮装饰、没有起动马达的汽车一样有用。将其发回并投诉。@MichaelKay:ClearCase是一个版本控制系统,VOB是一个版本化的对象库,这是它用于存储版本信息的机制。Re裸URL和in URL可以替换为&;或;,1您不能随意将URL中的&in替换为;。CGI.pm和其他人认为它们是相同的,但这既不是标准也不是通用的,即使你假设所有查询都是形式数据。2有可能用&;替换&;也不是正确的修复,例如&foo可能是&foo;的拼写错误;,因此,即使这样也不能保证是正确的修复。不正确的修复。Re裸URL和in URL可以替换为&;或;,1您不能随意将URL中的&in替换为;。CGI.pm和其他人认为它们是相同的,但这既不是标准也不是通用的,即使你假设所有查询都是形式数据。2有可能用&;替换&;也不是正确的修复,例如&foo可能是&foo;的拼写错误;,因此,即使这样也不能保证是正确的修复。不正确的修复。