Pregunta

Estoy tratando de pasar el código XML siguiente, en primera instancia mediante el simplexml_load_file función de php. Actualmente el código PHP es muy simple de la siguiente manera:

if (file_exists('test.xml')) {
    $xml = simplexml_load_file('test.xml');

    print_r($xml);
} else {
    exit('Failed to open test.xml.');
}

Sin embargo, en la ejecución de este archivo se da en primer lugar un error de análisis que el URI PostcodeAnywhere no es absoluta. En última instancia el guión lanza el error 'Cadena no se pudo analizar como XML'.

El archivo XML en sí parece validar y no muestra ningún error.

<?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>
¿Fue útil?

Solución

SimpleXML está ahogando en esa declaración de espacio válido. Cómo se controla el XML de origen? Si es así, puede quitar el espacio de nombres o fijarlo a utilizar un URN. De lo contrario, podría ser una opción en libxml hacer caso omiso de los espacios de nombres malos?

<!-- no namespace -->
<DataSet>

<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">

Edit: me deja modificar dicho, SimpleXML no es asfixia , es simplemente aclarando su garganta con fuerza. Usted recibe un montón de advertencias, pero eso es todo, se crea un SimpleXMLElement y parece que funciona por lo que pude ver. Si no puede solucionar el XML de origen y las advertencias que se moleste, sólo puede desactivar el informe de errores durante la carga, así:

libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);

Otros consejos

No sé, su apariencia XML bien (tal vez usted necesita para eliminar la declaración <? ?>, sin embargo.) Como regla general, el propio analizador XML es muy detallado en decir lo que está mal.

Para obtener errores del analizador, puede

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top