php5 simple_xml_file Parse-Fehler
Frage
Ich versuche, den XML-Code unten zu passieren, in erster Linie der PHP-Funktion simplexml_load_file verwenden. Derzeit ist der PHP-Code ist unglaublich einfach, wie folgt:
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
print_r($xml);
} else {
exit('Failed to open test.xml.');
}
Allerdings hat diese Datei auf läuft es gibt zunächst einen Parser-Fehler, dass der URI PostcodeAnywhere nicht absolut ist. Letztlich das Skript führt der Fehler ‚String nicht als XML analysiert werden.‘
Die XML-Datei selbst scheint zu bestätigen und zeigt keine Fehler.
<?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>
Lösung
SimpleXML ist erstickt an dieser ungültigen Namespace-Deklaration. Haben Sie die XML-Quelle steuern? Wenn ja, können Sie den Namespace entfernen oder reparieren eine URN zu verwenden. Andernfalls könnte es eine Option in libxml zu schlecht Namespaces zu ignorieren?
<!-- no namespace -->
<DataSet>
<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">
Edit: lassen Sie mich das ändern, SimpleXML ist nicht Würgen , es klart nur seine Kehle laut. Sie erhalten eine Reihe von Warnungen, aber das ist alles, ein SimpleXMLElement erstellt und scheint zu arbeiten, was ich sehen konnte. Wenn Sie die XML-Quell beheben können und die Warnungen stören, können Sie einfach die Fehlerberichterstattung während des Ladens ausschalten, etwa so:
libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
Andere Tipps
Ich weiß nicht, Ihre XML sieht gut aus (vielleicht müssen Sie die <? ?>
Erklärung entfernen, though.) Als allgemeine Regel gilt, der XML-Parser selbst ist sehr detailliert zu erzählen, was los ist.
Um die Parser-Fehler zu erhalten, können Sie entweder
-
schalten Sie
error_reporting()
oder -
eine Kombination aus
libxml_use_internal_errors()
undlibxml_get_errors()
Fehler Parsen angezeigt werden soll.