views:

224

answers:

2

Hello,

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. If anybody is able to shed any light on this it would be greatly appreciated.

Thanks

<?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>
A: 

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

Pekka
A: 

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);
Josh Davis
Looking at it you are indeed correct with that. Great thanks for the help.
simnom