php5 errore simple_xml_file parse
Domanda
Sto cercando di passare il codice XML di seguito, in primo luogo tramite la funzione php simplexml_load_file. Attualmente il codice php è incredibilmente semplice come segue:
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
print_r($xml);
} else {
exit('Failed to open test.xml.');
}
Tuttavia a correre questo file dà in primo luogo un errore di analisi che l'URI PostcodeAnywhere non è assoluta. In definitiva lo script genera l'errore 'String Impossibile analizzare come XML'.
Il file XML stesso sembra convalidare e non mostra alcun errore.
<?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>
Soluzione
SimpleXML sta soffocando su tale dichiarazione dello spazio dei nomi non valido. Si fa a controllare l'XML di origine? Se è così, è possibile rimuovere lo spazio dei nomi o risolvere il problema di utilizzare un URN. In caso contrario, ci potrebbe essere un'opzione in libxml di ignorare cattivi namespace?
<!-- no namespace -->
<DataSet>
<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">
Edit: mi permetta di modificare tale, SimpleXML non è soffocamento , è semplicemente deselezionando la gola rumorosamente. Si ottiene un sacco di avvertimenti, ma questo è tutto, viene creato un SimpleXMLElement e sembra funzionare da quello che ho potuto vedere. Se non è possibile risolvere il XML di origine e le avvertenze fastidio, si può semplicemente disattivare la segnalazione degli errori in fase di carico, in questo modo:
libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
Altri suggerimenti
Non lo so, il vostro XML guarda bene (forse è necessario rimuovere la dichiarazione <? ?>
, però.) Come regola generale, il parser XML in sé è molto dettagliata nel raccontare ciò che è sbagliato.
Per ottenere gli errori del parser, è possibile
-
girare a
error_reporting()
o -
utilizzare una combinazione di
libxml_use_internal_errors()
elibxml_get_errors()
per visualizzare errori di analisi.