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>
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top