php5 erreur d'analyse syntaxique simple_xml_file
Question
Je suis en train de passer le code XML ci-dessous, en première instance en utilisant la fonction php simplexml_load_file. Actuellement, le code php est incroyablement simple comme suit:
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
print_r($xml);
} else {
exit('Failed to open test.xml.');
}
Toutefois, sur l'exécution de ce fichier, il donne d'abord une erreur d'analyse que l'URI PostcodeAnywhere n'est pas absolue. En fin de compte le script lance l'erreur "chaîne ne peut pas être analysé comme XML.
Le fichier XML lui-même semble valider et ne montre aucune erreur.
<?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>
La solution
SimpleXML est étouffait cette déclaration d'espace de noms non valide. Contrôlez-vous le XML source? Si oui, vous pouvez supprimer l'espace de noms ou le fixer à utiliser un URN. Dans le cas contraire, il pourrait y avoir une option libxml d'ignorer les mauvaises namespaces?
<!-- no namespace -->
<DataSet>
<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">
Edit: laissez-moi modifier cette, SimpleXML est pas suffocation , il est Clearing simplement la gorge bruyamment. Vous obtenez un tas de mises en garde, mais c'est tout, un SimpleXMLElement est créé et semble fonctionner à partir de ce que je pouvais voir. Si vous ne pouvez pas fixer le XML source et les avertissements que vous dérange pas, vous pouvez simplement désactiver le rapport d'erreurs pendant le chargement, comme suit:
libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
Autres conseils
Je ne sais pas, votre XML semble bien (vous devez peut-être supprimer la déclaration de <? ?>
, cependant.) En règle générale, l'analyseur XML lui-même est très détaillé en dire ce qui ne va pas.
Pour obtenir les erreurs de l'analyseur, vous pouvez soit
-
tour sur
error_reporting()
ou -
utiliser une combinaison de
libxml_use_internal_errors()
etlibxml_get_errors()
pour afficher erreurs d'analyse syntaxique.