我正在使用XML::LibXML::Schema
加载架构。该架构有多个包含语句。
问题在于它引用的文件位于不同的根目录中,该目录也在我的Perl代码中定义。
有没有办法让XML::LibXML
检查这个根目录以及include语句中的文件?
例如,假设XML文件的当前工作目录为C:\test\test2
,并且XML文件具有以下语句:
<xs:include schemaLocation="testFile.xsd" />
但testFile.xsd
的实际路径为C:\test\testFile.xsd
当我使用XML::LibXML
这样验证架构时
my $schemaTest = XML::LibXML::Schema->new( originalXMLFile.xsd );
它出错,因为找不到testFile.xsd
。
有没有办法查看testFile.xsd
的其他目录?
答案 0 :(得分:1)
XML :: LibXML基于libxml2,因此您可以使用XML Catalog。您必须创建包含条目的目录文件,例如:
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<uri name="foo.xsd" uri="file:///c:/yourpath/foo.xsd"/>
</catalog>
使用$parser->load_catalog( $catalog_file );
答案 1 :(得分:0)
您可以使用input callbacks拦截从XML::LibXML
到文件系统和网络的每次访问。您所要做的就是实现并注册四个回调函数。看看example in the documentation。
在您的情况下,您可以实现一个 open 处理程序,用于检查目录列表中的文件。
答案 2 :(得分:-3)
由于信息非常少,答案必须是否
如果指定了XML以允许搜索XSD文件,那么所有地狱都会破裂,而格式不正确的数据会在互联网范围内搜索匹配的文件
由于您正在使用Windows,因此我建议您使用NTFS Junction Points
来实现所需目标