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>
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top