php5 simple_xml_file 解析错误
题
我尝试在第一个实例中使用 php 函数 simplexml_load_file 传递下面的 XML 代码。目前 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()
显示解析错误。
不隶属于 StackOverflow