php5 simple_xml_file ошибка разбора - PullRequest
0 голосов
/ 27 января 2010

Я пытаюсь передать приведенный ниже код 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>

Ответы [ 2 ]

0 голосов
/ 27 января 2010

SimpleXML душит это недопустимое объявление пространства имен. Вы контролируете исходный XML? Если это так, вы можете удалить пространство имен или исправить его для использования URN. В противном случае в libxml может быть опция игнорирования неверных пространств имен?

<!-- no namespace -->
<DataSet>

<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">

Изменить: позвольте мне изменить это, SimpleXML не удушье , это просто громко прочистить горло. Вы получаете кучу предупреждений, но это все, элемент SimpleXMLE создан и, кажется, работает из того, что я мог видеть. Если вы не можете исправить исходный XML, а предупреждения вас беспокоят, вы можете просто отключить создание отчетов об ошибках во время загрузки, например:

libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
0 голосов
/ 27 января 2010

Я не знаю, ваш XML выглядит нормально (хотя, возможно, вам нужно удалить объявление <? ?>.) Как правило, сам синтаксический анализатор XML очень подробно описывает, что не так.

Чтобы получить ошибки парсера, вы можете либо

  • включить error_reporting() или

  • используйте комбинацию libxml_use_internal_errors() и libxml_get_errors() для отображения ошибок разбора.

...