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

时间:2016-02-19 22:14:50

标签: xml perl libxml2

我正在使用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的其他目录?

3 个答案:

答案 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

来实现所需目标

您应该查看specification for XInclude