php5 simples_xml_file erros de análise
Pergunta
Estou tentando passar o código XML abaixo, na primeira instância usando a função php simplexml_load_file. Atualmente, o código PHP é incrivelmente simples da seguinte maneira:
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
print_r($xml);
} else {
exit('Failed to open test.xml.');
}
No entanto, ao executar este arquivo, primeiro dá um erro de análise de que o Uri Post -Codeanywhere não é absoluto. Em última análise, o script lança o erro 'String não poderia ser analisado como XML'.
O próprio arquivo XML parece validar e não mostra erros.
<?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>
Solução
Simpxml está sufocando nessa declaração de namespace inválida. Você controla a fonte XML? Nesse caso, você pode remover o espaço para nome ou corrigi -lo para usar uma urna. Caso contrário, pode haver uma opção no libxml para ignorar maus espaços para nome?
<!-- no namespace -->
<DataSet>
<!-- URN -->
<DataSet xmlns="urn:PostcodeAnywhere">
Editar: deixe -me alterar que, simpexml não é sufocando, está apenas limpando sua garganta em voz alta. Você recebe um monte de avisos, mas isso é tudo, um SimplexMleLement é criado e parece funcionar pelo que eu podia ver. Se você não pode consertar o XML da fonte e os avisos o incomodam, basta desativar os relatórios de erro durante o carregamento, assim:
libxml_use_internal_errors(false);
$xml = simplexml_load_file('test.xml');
libxml_use_internal_errors(false);
Outras dicas
Eu não sei, seu XML parece bem (talvez você precise remover o <? ?>
Declaração, no entanto.) Como regra geral, o próprio analisador XML é muito detalhado ao dizer o que está errado.
Para obter os erros do analisador, você pode
ligar
error_reporting()
ouUse uma combinação de
libxml_use_internal_errors()
elibxml_get_errors()
Para exibir erros de análise.