我正在尝试传递下面的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>
答案 0 :(得分:0)
我不知道,你的XML看起来很好(可能你需要删除<? ?>
声明。)作为一般规则,XML解析器本身在描述错误时非常详细。
要获得解析器的错误,您可以
启用 error_reporting()
或
使用libxml_use_internal_errors()
和 libxml_get_errors()
的组合来显示解析错误。
答案 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);