I am trying to pass the XML code below, in the first instance using the php function simplexml_load_file. Currently the php code is incredibly simple as follows:
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
print_r($xml);
} else {
exit('Failed to open test.xml.');
}
However on running this file it firstly gives a parse error that the URI PostcodeAnywhere is not absolute. Ultimately the script throws the error 'String could not be parsed as XML'.
The XML file itself seems to validate and doesn't show any errors.
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="PostcodeAnywhere">
<xs:schema id=开发者_StackOverflow"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 is choking on that invalid namespace declaration. Do you control the source XML? If so, you can remove the namespace or fix it to use a URN. Otherwise, there might be an option in libxml to ignore bad namespaces?
<!-- no namespace -->
<DataSet>
<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">
Edit: let me amend that, SimpleXML isn't choking, it's merely clearing its throat loudly. You get a bunch of Warnings but that's all, a SimpleXMLElement is created and seems to work from what I could see. If you can't fix the source XML and the warnings bother you, you can just turn off the error reporting during loading, like so:
libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
I don't know, your XML looks fine (maybe you need to remove the <? ?>
declaration, though.) As a general rule, the XML parser itself is very detailed in telling what's wrong.
To get the parser's errors, you can either
turn on
error_reporting()
oruse a combination of
libxml_use_internal_errors()
andlibxml_get_errors()
to display parsing errors.
精彩评论