(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>

如果我交换 2527 行(即我将 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 );