سؤال

أنا أستخدم ملف منفصل .dtd كملف Doctype لملف XML المخصص الخاص بي:

names.xml.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

names.dd.

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!-- Placeholder/unknown history or creator name -->
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">

ومع ذلك عند محاولة الوصول إلى Names.xml أحصل على الخطأ التالي:

خطأ في تحليل XML: موقع كيان غير محدد: http: //localhost/.../names.xml. الخط رقم 5، العمود 18:

<text>Pep&eacute;</text>
---------^

فقط للحصول على أسماء التوضيح. xml و names.dtd موجودة في نفس الدليل واستخدام http: //localhost/.../names.dtd. لا يعمل أيضا.

يبدو أن هذا يعمل عند وضع <!ENTITY داخل <!DOCTYPE في names.xml ومع ذلك. يمكن لأي شخص تقديم المشورة بشأن هذا؟

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

المحلول

إذا كنت تفتح المستند في Firefox لمحاولة معرفة ما إذا كان لديك صحيح DTD، فلا. Firefox لا يمر XML و DTD من خلال محلل XML مناسب. افتح مستند XML الخاص بك في IE الذي سيؤدي إلى تمرير المستند الخاص بك من خلال محلل MSXML.

عند فتح مستند XML في IE، سيقوم بإلقاء خطأ حول DTD باستخدام أحرف غير صالحة. تحتاج إلى استخدام رمز الحرف ل EACETE بدلا من الحرف نفسه. هنا هو الرمز الذي حصلت عليه ...

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE NAME SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
   </name>
</names>

و

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "&#233;">

نصائح أخرى

ثعلب النار لا تحميل DTDS خارجي (ولا سفاري؛ يشبه لا المتصفحات تفعل). يعمل DTD & XML الخاص بك بشكل جيد في xmllint إذا أخبرته لتحميل DTDs الخارجية:

$ xmllint --loaddtd names.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE names SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

تعديل: كما يشير HSIVONEN في التعليقات، باستخدام DTDS لحل الكيانات الخارجية هو فكرة سيئة. وبعد يجب عليك عموما عدم استخدام DocTypes أو DTDs على الويب. إذا كنت ترغب في التحقق من صحة مستند، فيجب عليك استخدام مخطط منفصل (الاسترخاء نانوغرام يوصى به لهذا الغرض)، وليس DTD مضمن في المستند نفسه.

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