php5 simple_xml_file parse error
سؤال
أحاول تمرير رمز XML أدناه ، في الحالة الأولى باستخدام وظيفة PHP SimpleXML_LOAD_FILE. حاليًا رمز PHP بسيط للغاية على النحو التالي:
if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');
print_r($xml);
} else {
exit('Failed to open test.xml.');
}
ومع ذلك ، عند تشغيل هذا الملف ، فإنه يعطي أولاً خطأ في التحليل بأن uri postcodeany لا يكون مطلقًا. في نهاية المطاف ، يلقي البرنامج النصي "سلسلة الخطأ" لا يمكن تحليلها كـ 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>
المحلول
SimpleXML يختنق إعلان مساحة الاسم غير الصالح. هل تتحكم في المصدر XML؟ إذا كان الأمر كذلك ، يمكنك إزالة مساحة الاسم أو إصلاحه لاستخدام جرة. خلاف ذلك ، قد يكون هناك خيار في 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);
نصائح أخرى
لا أعرف ، يبدو XML الخاص بك جيدًا (ربما تحتاج إلى إزالة <? ?>
الإعلان ، رغم ذلك). كقاعدة عامة ، فإن محلل XML نفسه مفصل للغاية في إخبار الخطأ.
للحصول على أخطاء المحلل ، يمكنك أيضًا
شغله
error_reporting()
أواستخدم مجموعة من
libxml_use_internal_errors()
وlibxml_get_errors()
لعرض أخطاء التحليل.