【问题标题】:XML validation, nested XSD and UNC pathsXML 验证、嵌套的 XSD 和 UNC 路径
【发布时间】:2011-05-10 09:41:43
【问题描述】:

我想在 PHP/5.3.0 上使用 XMLReader 针对本地 XSD 文件验证 XML 文档。该架构称为test.xsd,它包含对第二个架构的引用:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:include schemaLocation="common.xsd"/>

我在同一目录中拥有所有文件的副本。代码的相关部分如下所示:

<?php

define('DIR_XML', dirname(__FILE__) . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR);

$oXMLReader = new XMLReader;

$oXMLReader->open('test.xml');
$oXMLReader->setSchema(DIR_XML . 'test.xsd');

while( $oXMLReader->read() ){
}
$oXMLReader->close();

?>

如果samples 目录位于网络服务器本地并且可以通过驱动器号访问,我的代码工作正常,例如:

define('DIR_XML', 'C:\samples' . DIRECTORY_SEPARATOR);

但是,真实数据位于可通过 UNC 路径访问的网络驱动器中:

\\SERVER\WEB PROJECTS\foo\samples

这就是问题所在:在这种情况下(并且仅在这种情况下)PHP 加载 test.xsd 很好,但它找不到 common.xsd。我收到警告:

警告:XMLReader::setSchema() [xmlreader.setschema]:无法设置 架构。这必须在之前设置 读取或架构包含错误。

...以及以下 XML 错误:

警告 1549(起始元素):失败 加载外部实体 "/SERVER/WEB%20PROJECTS/foo/samples/common.xsd"

错误 3050(起始元素):元素 '{http://www.w3.org/2001/XMLSchema}包括': 加载文档失败 '/SERVER/WEB%20PROJECTS/foo/samples/common.xsd' 纳入。

似乎 PHP 将 UNC 路径误解为 URL :-?

有什么办法或技巧可以解决这个问题吗?

【问题讨论】:

    标签: php xml xsd


    【解决方案1】:

    我遇到了类似的问题,我可以解决的唯一方法是使用从本地 HDD 到 UNC 路径(Windows)的符号链接:mklink /D "C:\SomeDir" "//Some//UNC//Path"

    本以为这也适用于 linux

    【讨论】:

    • 我最终厌倦了,只是符号链接了我所有重要的网络路径。有太多应用程序不支持 UNC。
    【解决方案2】:

    如果不看到存储\\SERVER\WEB PROJECTS\foo\sample 的字符串是什么样子,就很难回答。这可能是需要转义的原因,因为\\ 产生\,而\\\\ 需要产生\\

    【讨论】:

    • 嗯,PHP 能够使用相同的路径找到test.xmltest.xsd,但不能使用同一目录中的common.xsd。如何影响 libxml 在内部处理路径的方式?
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多