php5 simple_xml_file解析错误

时间:2010-01-27 10:51:49

标签: php xml simplexml

我正在尝试传递下面的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不是绝对的。最终,脚本会抛出错误“String无法解析为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 :(得分:0)

我不知道,你的XML看起来很好(可能你需要删除<? ?>声明。)作为一般规则,XML解析器本身在描述错误时非常详细。

要获得解析器的错误,您可以

答案 1 :(得分:0)

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);