Ошибка синтаксического анализа php5 simple_xml_file
Вопрос
Я пытаюсь передать приведенный ниже XML-код, в первую очередь используя функцию PHP simplexml_load_file.На данный момент PHP-код невероятно прост и выглядит следующим образом:
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
print_r($xml);
} else {
exit('Failed to open test.xml.');
}
Однако при запуске этого файла сначала выдается ошибка анализа, что URI PostcodeAnywhere не является абсолютным.В конечном итоге скрипт выдает ошибку «Строка не может быть проанализирована как XML».
Сам XML-файл, кажется, проверяется и не показывает никаких ошибок.
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="PostcodeAnywhere">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Table1">
<xs:complexType>
<xs:sequence>
<xs:element name="Id" type="xs:string" minOccurs="0" />
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="Items" type="xs:string" minOccurs="0" />
<xs:element name="BillingModel" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<Table1 diffgr:id="Table11" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<Id>3898</Id>
<Name>DIA Members</Name>
<Items />
<BillingModel>PREPAID</BillingModel>
</Table1>
</NewDataSet>
</diffgr:diffgram>
</DataSet>
Решение
SimpleXML задыхается от этого неверного объявления пространства имен.Вы контролируете исходный XML?Если это так, вы можете удалить пространство имен или исправить его, чтобы использовать URN.В противном случае в libxml может быть возможность игнорировать неправильные пространства имен?
<!-- no namespace -->
<DataSet>
<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">
Редактировать:позвольте мне исправить это, SimpleXML не задыхаясь, он просто громко откашливается.Вы получаете кучу предупреждений, но это все, SimpleXMLElement создан и, судя по тому, что я видел, работает.Если вы не можете исправить исходный XML и вас беспокоят предупреждения, вы можете просто отключить отчеты об ошибках во время загрузки, например:
libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
Другие советы
Я не знаю, ваш XML выглядит нормально (возможно, вам нужно удалить <? ?>
однако.) Как правило, сам синтаксический анализатор XML очень подробно сообщает, что не так.
Чтобы получить ошибки парсера, вы можете либо
включать
error_reporting()
илииспользовать комбинацию
libxml_use_internal_errors()
иlibxml_get_errors()
для отображения ошибок синтаксического анализа.