(perl) Xerces 验证如何访问 http 模式?
How does (perl) Xerces validation access http schemas?
这个自包含示例(路径名:/root/stef/test.pl
)在服务器 A-OK
上运行良好,但在另一台服务器 B-NOK
.
上运行不正常
1 use strict;
2 use XML::Validate::Xerces;
3
4 sub main {
5 my $rsep = $/;
6 undef $/;
7 my $xml = <DATA>;
8 $/ = $rsep;
9
10 warn "working on this xml:[\n$xml]";
11
12 my %options;
13 my $validator = new XML::Validate::Xerces(%options);
14 my $valid = $validator->validate($xml) ? '' : 'in';
15 warn "Document is ${valid}valid\n";
16 }
17
18 main();
19
20 __DATA__
21 <?xml version="1.0"?>
22 <note
23 xmlns="https://www.w3schools.com"
24 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
25 xsi:schemaLocation="https://www.w3schools.com http://www.w3schools.com/xml/note.xsd">
26 <!--
27 xsi:schemaLocation="https://www.w3schools.com file:///root/stef/note.xsd">
28 -->
29 <to>Tove</to>
30 <from>Jani</from>
31 <heading>Reminder</heading>
32 <body>Don't forget me this weekend!</body>
33 </note>
如果我交换 25 和 27 行(即我将 http://www.w3schools.com/xml/note.xsd
更改为 file:///root/stef/note.xsd
),那么将架构作为本地文件,那么即使在 B-NOK
.
中也能正常工作
当架构在 http 上时,唯一的区别就出现了。
请注意,本地文件被下载为 wget http://www.w3schools.com/xml/note.xsd
这样我不仅知道模式文件的内容是相同的(本地和远程)而且 http:80
可以很好地捕获那里的东西.
我没有做任何特别的事情来让 Xerces 在 http:80 上为服务器 A-OK
工作。
然后我希望在服务器 B-NOK
上不做任何事情,让 Xerces 在那里获取模式。
我没有找到明确的信息 if/how 应该指示 Xerces 使用 http。它没有内置哪种机制,可以像 wget 一样下载 URLs。
如果我必须添加一些配置变量,我就无法理解。
服务器 B-NOK
的管理员告诉我,在执行手册 wget
时,他没有看到任何试图分开 http://www.w3schools.com
的东西。这看起来 Xerces 根本不费心去得到那个 URL。
真的非常感谢您的任何提示。
来源:
if ($strict) {
TRACE("Using strict validation");
$DOMparser->setValidationScheme("$XML::Xerces::AbstractDOMParser::Val_Auto");
$DOMparser->setIncludeIgnorableWhitespace(0);
$DOMparser->setDoSchema(1);
$DOMparser->setDoNamespaces(1);
$DOMparser->setValidationSchemaFullChecking(1);
$DOMparser->setLoadExternalDTD(1);
$DOMparser->setExitOnFirstFatalError(1);
$DOMparser->setValidationConstraintFatal(1);
} else {
TRACE("Using no validation");
$DOMparser->setValidationScheme("$XML::Xerces::AbstractDOMParser::Val_Never");
$DOMparser->setDoSchema(0);
$DOMparser->setDoNamespaces(0);
$DOMparser->setValidationSchemaFullChecking(0);
$DOMparser->setLoadExternalDTD(0);
}
请注意 setLoadExternalDTD
设置仅在严格验证模式下为真。
使用以下方法应该可以解决问题:
my $validator = XML::Validate::Xerces->new( strict_validation => 1 );
这个自包含示例(路径名:/root/stef/test.pl
)在服务器 A-OK
上运行良好,但在另一台服务器 B-NOK
.
1 use strict;
2 use XML::Validate::Xerces;
3
4 sub main {
5 my $rsep = $/;
6 undef $/;
7 my $xml = <DATA>;
8 $/ = $rsep;
9
10 warn "working on this xml:[\n$xml]";
11
12 my %options;
13 my $validator = new XML::Validate::Xerces(%options);
14 my $valid = $validator->validate($xml) ? '' : 'in';
15 warn "Document is ${valid}valid\n";
16 }
17
18 main();
19
20 __DATA__
21 <?xml version="1.0"?>
22 <note
23 xmlns="https://www.w3schools.com"
24 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
25 xsi:schemaLocation="https://www.w3schools.com http://www.w3schools.com/xml/note.xsd">
26 <!--
27 xsi:schemaLocation="https://www.w3schools.com file:///root/stef/note.xsd">
28 -->
29 <to>Tove</to>
30 <from>Jani</from>
31 <heading>Reminder</heading>
32 <body>Don't forget me this weekend!</body>
33 </note>
如果我交换 25 和 27 行(即我将 http://www.w3schools.com/xml/note.xsd
更改为 file:///root/stef/note.xsd
),那么将架构作为本地文件,那么即使在 B-NOK
.
当架构在 http 上时,唯一的区别就出现了。
请注意,本地文件被下载为 wget http://www.w3schools.com/xml/note.xsd
这样我不仅知道模式文件的内容是相同的(本地和远程)而且 http:80
可以很好地捕获那里的东西.
我没有做任何特别的事情来让 Xerces 在 http:80 上为服务器 A-OK
工作。
然后我希望在服务器 B-NOK
上不做任何事情,让 Xerces 在那里获取模式。
我没有找到明确的信息 if/how 应该指示 Xerces 使用 http。它没有内置哪种机制,可以像 wget 一样下载 URLs。
如果我必须添加一些配置变量,我就无法理解。
服务器 B-NOK
的管理员告诉我,在执行手册 wget
时,他没有看到任何试图分开 http://www.w3schools.com
的东西。这看起来 Xerces 根本不费心去得到那个 URL。
真的非常感谢您的任何提示。
来源:
if ($strict) {
TRACE("Using strict validation");
$DOMparser->setValidationScheme("$XML::Xerces::AbstractDOMParser::Val_Auto");
$DOMparser->setIncludeIgnorableWhitespace(0);
$DOMparser->setDoSchema(1);
$DOMparser->setDoNamespaces(1);
$DOMparser->setValidationSchemaFullChecking(1);
$DOMparser->setLoadExternalDTD(1);
$DOMparser->setExitOnFirstFatalError(1);
$DOMparser->setValidationConstraintFatal(1);
} else {
TRACE("Using no validation");
$DOMparser->setValidationScheme("$XML::Xerces::AbstractDOMParser::Val_Never");
$DOMparser->setDoSchema(0);
$DOMparser->setDoNamespaces(0);
$DOMparser->setValidationSchemaFullChecking(0);
$DOMparser->setLoadExternalDTD(0);
}
请注意 setLoadExternalDTD
设置仅在严格验证模式下为真。
使用以下方法应该可以解决问题:
my $validator = XML::Validate::Xerces->new( strict_validation => 1 );