Question

I am trying to pass the XML code below, in the first instance using the php function simplexml_load_file. Currently the php code is incredibly simple as follows:

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

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

However on running this file it firstly gives a parse error that the URI PostcodeAnywhere is not absolute. Ultimately the script throws the error 'String could not be parsed as XML'.

The XML file itself seems to validate and doesn't show any errors.

<?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>
Was it helpful?

Solution

SimpleXML is choking on that invalid namespace declaration. Do you control the source XML? If so, you can remove the namespace or fix it to use a URN. Otherwise, there might be an option in libxml to ignore bad namespaces?

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

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

Edit: let me amend that, SimpleXML isn't choking, it's merely clearing its throat loudly. You get a bunch of Warnings but that's all, a SimpleXMLElement is created and seems to work from what I could see. If you can't fix the source XML and the warnings bother you, you can just turn off the error reporting during loading, like so:

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

OTHER TIPS

I don't know, your XML looks fine (maybe you need to remove the <? ?> declaration, though.) As a general rule, the XML parser itself is very detailed in telling what's wrong.

To get the parser's errors, you can either

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow