Проверка XML, вложенные пути XSD и UNC - PullRequest
1 голос
/ 10 мая 2011

Я хочу проверить XML-документ по локальному XSD-файлу, используя XMLReader на PHP / 5.3.0. Схема называется 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}include': Не удалось загрузить документ '/SERVER/WEB%20PROJECTS/foo/samples/common.xsd' для включения.

Похоже, что PHP неправильно интерпретирует путь UNC как URL: -?

Есть ли какая-нибудь опция или хитрость, чтобы это исправить?

Ответы [ 2 ]

1 голос
/ 01 июля 2013

Я столкнулся с подобной проблемой, и единственный способ исправить это - использовать символическую ссылку с локального жесткого диска на путь UNC (windows): mklink /D "C:\SomeDir" "//Some//UNC//Path"

подумал бы, что это будет работать и в Linux

0 голосов
/ 11 мая 2011

Трудно ответить, не видя, как выглядит строка \\SERVER\WEB PROJECTS\foo\sample.Это может быть причиной необходимости экранирования, так как \\ производит \, а \\\\ требуется для получения \\.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...