在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
?
这么很少的信息,答案必须是没有
如果XML被指定为允许XSD文件的搜索,然后所有的地狱将打破松散而畸形数据发起的互联网范围内寻找一个匹配的文件
既然你使用Windows系统,我建议你可以达到你所需要的与NTFS Junction Points
XML :: LibXML基于libxml2,因此您可以使用XML Catalog。你将不得不创建一个包含项目,如目录文件:使用$parser->load_catalog($catalog_file);
您可以拦截使用input callbacks从XML::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。
在你的情况下,你可以实现一个开放处理程序,检查目录列表中的文件。
谢谢,但它似乎只支持在LibXML的解析器函数中,而不是模式函数。 – user120920
你正在谈论的一个例子会使这个问题变得更好。 – mob
@mob谢谢,我已经更新了这个问题。 – user120920
按照选项,我看到四种可能的解决方案最简单的方法是设置'base_uri'选项。 – ikegami