2010-01-27 4 views
0

PHP 코드 simplexml_load_file을 사용하여 첫 번째 인스턴스에서 XML 코드를 전달하려고합니다. 다음과 같이 현재 PHP 코드는 매우 간단하다 : php5 simple_xml_file 구문 분석 오류

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

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

그러나이 파일을 실행에는 먼저 URI PostcodeAnywhere 절대 아니라고 구문 분석 오류를 제공합니다. 궁극적으로 스크립트는 'String을 XML로 파싱 할 수 없습니다'라는 오류를 발생시킵니다.

XML 파일 자체의 유효성을 검사하는 것으로 보이며 오류가 표시되지 않습니다. 나도 몰라

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

답변

0

SimpleXML이 잘못된 네임 스페이스 선언에 질식합니다. 소스 XML을 제어합니까? 그렇다면 네임 스페이스를 제거하거나 수정하여 URN을 사용할 수 있습니다. 그렇지 않으면 libxml에 잘못된 네임 스페이스를 무시하는 옵션이있을 수 있습니까?

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

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

편집 : 내가 그 개정하자, SimpleXML을가 질식하지 , 그것은 단지 큰 소리로 자신의 목을 삭제합니다. 한 무리의 경고를 얻지 만 그게 전부입니다. SimpleXMLElement가 만들어지고 볼 수있는 것으로부터 작동하는 것 같습니다. 소스 XML을 고칠 수없고 경고로 인해 문제가 해결되지 않으면로드하는 동안 오류보고 기능을 해제하면됩니다. 예 :

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

실제로 그 점을 확인하십시오. 도움에 큰 감사드립니다. – simnom

0

, 당신의 XML은 (어쩌면 당신은 그래도 <? ?> 선언을 제거해야합니다.) 일반적으로, XML 파서 자체가 문제가 있는지 이야기에서 매우 상세한입니다 잘 보인다.

는 구문 분석 오류를 표시하는 libxml_use_internal_errors()libxml_get_errors()의 조합을 사용 error_reporting() 또는

  • 에서 다음 중 하나를 수행 할 수 있습니다

    • 차례, 파서의 에러가 발생합니다.