سؤال

واعتدت دلفي بيانات عام 2006 المعالج ملزمة لإنشاء واجهة لملف التكوين XML. في وقت لاحق أدركت أن بعض أجزاء المتكرر للXML يمكن فصلها عن الملف الرئيسي والرجوع إليها عند الحاجة. وXML الناتجة يبدو شيئا من هذا القبيل:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
  <schema>&Schema65;</schema>
</module>

إذا كنت فتح هذا الملف باستخدام Internet Explorer محتويات العنصر النائب "وSchema65." يتم استبدال بشكل صحيح مع محتويات الملف الخارجي. محلل دلفي ولكن لا يبدو أن تعترف هذه الميزة ولا يحل محل النص. أي فكرة عن كيفية حل هذه القضية؟

هل كانت مفيدة؟

المحلول

وإنترنت إكسبلورر وبالتأكيد تستخدم المكتبة MSXML. تعيين الخاصية TXmlDocument.DomVendor إلى MSXML_DOM (وجدت في وحدة msxmldom)، ويجب عليك الحصول على نفس السلوك. يمكنك أيضا تغيير المتغير العالمي DefaultDOMVendor إلى SMSXML لجعل كافة الكائنات TXmlDocument جديدة تستخدم ذلك البائع.

نصائح أخرى

ولقد حاولت بالفعل OmniXML ؟ لقد تم استخدامه لسنوات، وأنها دائما حل مشاكلي بشأن ملفات XML. إذا كان لديك لم يكن كذلك، فما استقاموا لكم فاستقيموا المشورة لك لمحاولة إعطائها: انها بسيطة لاستخدام، وعلى ضوء مجانا

XmlResolver ، يتم استخدام الخاصية XmlResolver من XmlDocument من قبل فئة XmlDocument لتحديد الموارد التي لم يتم مضمنة في بيانات XML، مثل تعريفات الخارجية نوع المستند (تدس)، والكيانات، والمخططات. يمكن أن يكون موجودا هذه العناصر على الشبكة أو على محرك أقراص محلي، ويمكن تحديدها من قبل معرف الموارد الموحد (URI). وهذا يسمح للXmlDocument لحل العقد EntityReference التي تكون موجودة في وثيقة والتحقق من صحة الوثيقة وفقا لDTD الخارجي أو المخطط.

ويجب عليك استخدام مكتبة دلفي التي تطبق محلل ومحلل للموارد خارجية.

توسيع XML تنفذ محلل باستخدام TStandardResourceResolver

وداعا.

وفيما يلي تحل مشكلة بالنسبة لي. ويبدو أن دلفي محلل الافتراضي (MSXML) يتضمن في الواقع المراجع كيان الخارجية ولكن بطريقة غريبة إلى حد ما. على سبيل المثال

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
  <schema>&Schema65;</schema>
</module>

وأنا افترض أن خلق TXMLDocument وأن ملف خارجي يحتوي على نص بسيط أتمكن من الحصول على محتويات الملف من هذا القبيل:

MyXML := TXMLDOcument.Create(myfile.xml);
ExternalText := MyXML.documentElement.ChildNodes['schema'].Text;

وهذا في الواقع يعمل إذا تم استبدال مرجع الوحدة مع نص بسيط. ومع ذلك، في حالة استخدام الكيان الخارجي دلفي سيخلق طفل جديد من نوع "ntEntityRef" داخل العقدة "المخطط". وهذه العقدة أيضا أن يكون الطفل الذي يحتوي أخيرا نصي كنت أتوقع. النص يمكن أن يكون بالوصول إلى مثل هذا:

MyXML.documentElement.ChildNodes['schema'].FirstChild.FirstChild.Text;

في حالة الملف يحتوي على كيان خارجي هيكل عقدة، سيتم إنشاء العقد المقابلة داخل العقدة كيان المرجعية. جعل يتم تعيين تأكد TXMLDocument.ParseOptions على الأقل ل[poResolveExternals] لذلك أن يحدث. هذا النهج يجعل أيضا من السهل نسبيا على التكيف مع الشفرة التي تم إنشاؤها من قبل بيانات XML ربط معالج للعمل مع الجهات الخارجية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top