在Perl中使用LibXML检查XML中包含语句的文件的其他目录

问题描述:

我正在使用XML::LibXML::Schema加载模式。该模式有多个包含语句。在Perl中使用LibXML检查XML中包含语句的文件的其他目录

问题在于它引用的文件位于另一个根目录中,该目录也在我的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); 

它给出了一个错误becau它无法找到testFile.xsd

有没有办法在其他目录中查找testFile.xsd

+0

你正在谈论的一个例子会使这个问题变得更好。 – mob

+0

@mob谢谢,我已经更新了这个问题。 – user120920

+0

按照选项,我看到四种可能的解决方案最简单的方法是设置'base_uri'选项。 – ikegami

这么很少的信息,答案必须是没有

如果XML被指定为允许XSD文件的搜索,然后所有的地狱将打破松散而畸形数据发起的互联网范围内寻找一个匹配的文件

既然你使用Windows系统,我建议你可以达到你所需要的与NTFS Junction Points

你应该看看specification for XInclude

XML :: LibXML基于libxml2,因此您可以使用XML Catalog。你将不得不创建一个包含项目,如目录文件:使用$parser->load_catalog($catalog_file);

您可以拦截使用input callbacksXML::LibXML到文件系统和网络的每次访问它

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 
    <uri name="foo.xsd" uri="file:///c:/yourpath/foo.xsd"/> 
</catalog> 

负载。你所要做的就是实现和注册四个回调函数。看看example in the documentation

在你的情况下,你可以实现一个开放处理程序,检查目录列表中的文件。

+0

谢谢,但它似乎只支持在LibXML的解析器函数中,而不是模式函数。 – user120920