إستراتيجية لتحليل الكثير والكثير من مستندات SGML / XML غيرت بئر

StackOverflow https://stackoverflow.com/questions/4231135

سؤال

لدي الآلاف من مستندات SGML ، بعضها تم تشكيلها جيدًا ، وبعضها غير متشابه جيدًا. أحتاج إلى الحصول على عناصر معينة في المستندات ، لكن في كل مرة أذهب فيها إلى التحميل وأحاول قراءتها في XDocument أو XmldOcument أو حتى مجرد قائد StreamReader ، أحصل على أخطاء Xmlexception مختلفة.

أشياء مثل "" ["هو رمز غير متوقع.". لماذا ا؟ لأن لدي وثيقة مع doctype مثل

<!DOCTYPE RChapter PUBLIC "-//LSC//DTD R Chapter for Authoring//EN" [] >

وقد تعلمت أن [] يحتاج إلى الحصول على شيء صحيح في الداخل. مرة أخرى ، أنا لا أتحكم في إنشاء المستندات ، لكن علي "كسرها" والحصول على البيانات التي أريدها. مثال آخر هو وجود عنصر "غير مُصمم" ، على سبيل المثال:

<Caption>Plants, and facilities<hardhyphen><hyphen>Inspection.</Caption>

هذا Xmlexception هو "Hyphen" START TAG في السطر 27 لا يتطابق مع علامة النهاية لـ "Caption". السطر 27 ، الموضع 58. " واضح ، أليس كذلك؟

ولكن السؤال هو كيف يمكنك بالفعل الحصول على بعض عناصر في هذه المستندات ، دون مواجهة Xmlexpections. هل ساكس المحلل هو الطريق الصحيح؟ أرغب بشكل أساسي في فتح المستند ، والانتقال مباشرة إلى العنصر الذي أريده (دون القلق ما قد يكون أو لا يتم تشكيله جيدًا في مكان قريب) ، وسحب البيانات ، والمضي قدمًا. هل يجب أن أنسى التحليل باستخدام Xmldocument و XDocument و ASS فقط بدائل السلسلة البسيطة مثل

str.Replace("<hardhypen><hyphen>", "-")

ثم حاول تحميله في أحد محلات XML. أي نصائح حول الاستراتيجيات؟

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

المحلول

المشكلة هي أنك تحاول تحليل SGML باستخدام أداة XML. إنهم ليسوا متماثلين. إذا كنت ترغب في استخدام أداة/لغة XML للوصول إلى البيانات ، فربما ستحتاج إلى تحويل SGML إلى XML قبل محاولة تحليلها.

من الناحية المثالية ، يمكنك إما استخدام لغة/أداة تدعم SGML (مثل Omnimark) أو شيء يمكنه التعامل مع بيانات "XML Like" (مثل Nokogiri من الإجابة الأولى؟).

يمكن أن يكون هذا مستقيمًا إلى الأمام ، ولكن يمكن أن يصبح صعبًا في بعض النقاط. خاصة إذا كنت تتحدث عن العديد من أنواع docty (DTD). (أيضًا ، لا يوجد شيء من هذا القبيل SGML "تم تكوينه جيدًا". نعم ، يجب أن تكون العناصر/الخ. تتداخل بشكل صحيح ولكن SGML لديها للحصول على DTD.)

فيما يلي بعض الاختلافات بين SGML و XML التي تحتاج إلى التعامل معها. (قد لا ترغب في السير في هذا الطريق ، ولكن قد يكون من المفيد لأغراض إعلامية على أي حال.):

  1. إعلان Doctype

    إعلان DOCTYPE في مثالك هو doctype SGML صالح تمامًا. ال [] (مجموعة فرعية داخلية) لا يجب أن يكون لها أي شيء فيه. إذا كان لديك إعلانات في المجموعة الفرعية الداخلية (عادةً إعلانات الكيان) ، فمن المحتمل أن تضطر إلى الاحتفاظ بإعلان Doctype في XML.

    المشكلة التي يواجهها محلل XML هو أنه ليس لديك معرف نظام في الإعلان. في إعلان XML Doctype ، يكون معرف النظام مطلوبًا إذا كان هناك معرف عام. في إعلان SGML Doctype ، ليس مطلوبًا.

    الحد الأدنى: ما لم تكن بحاجة إلى XML لتحليلها إلى DTD/مخطط أو لديك إعلانات في المجموعة الفرعية الداخلية ، قم بتجريد إعلان Doctype. إذا كان يجب أن تكون XML صالحة ، فستحتاج على الأقل إلى إضافة معرف النظام. لا تنس إضافة <?xml ...?> تعليمات المعالجة.

  2. عناصر بدون علامات نهاية

    ال <hardhyphen> و <hyphen> العناصر صالحة SGML. يسمح لك SGML DTD بتحديد الحد الأدنى للعلامة. ما يعنيه هذا هو أنه يمكنك تحديد ما إذا كانت علامة نهاية مطلوبة أم لا. (يمكنك أيضًا جعل علامة البدء اختيارية ، ولكن هذا حديث مجنون.) في XML ، يجب عليك إغلاق هذه العناصر (مثل <hardhyphen/> أو <hardhyphen></hardhyphen>)

    أفضل ما عليك فعله هو النظر إلى SGML DTD ومعرفة العناصر التي لديها علامات نهاية اختيارية. يتم تحديد الحد الأدنى للعلامة مباشرة بعد اسم العنصر في إعلان العنصر. A '-' يعني أن العلامة مطلوبة. "O" (الحرف "أوه") يعني أن العلامة اختيارية. على سبيل المثال إذا رأيت <!ELEMENT hyphen - o (#PCDATA)>, ، هذا يعني أن علامة البدء مطلوبة (-) وعلامة النهاية اختيارية (o). إذا رأيت <!ELEMENT hyphen - - (#PCDATA)>, ، كل من العلامات البدء والنهاية مطلوبة.

    الحد الأدنى: أغلق جميع العناصر التي ليس لها علامات نهاية بشكل صحيح

  3. تعليمات المعالجة

    تعليمات المعالجة (PI's) في SGML ليس لديها الثانية ? عندما يتم إغلاقها مثل XML. ستحتاج إلى إضافة الثانية ?.

    مثال SGML PI: <?asdf jkl>

    مثال XML PI: <?asdf jkl?>

  4. الادراج/الاستثناءات

    ربما لن تضطر إلى القلق بشأن هذا ، ولكن في SGML DTD ، يمكنك تحديد في إعلان عنصر بأن عنصرًا آخر مسموح به في أي مكان داخل هذا العنصر (أو غير مسموح به). يمكن أن يكون هذا ألمًا إذا احتاجت XML المستهدفة إلى تحليل DTD ؛ XML DTD's لا تسمح بالضحافات/الاستثناءات.

    هذا ما قد يبدو عليه الإدراج:

    <!ELEMENT chapter - - (section)+ +(revst|revend)>

    هذا يقول ذلك revst أو revend مسموح به في أي مكان داخل chapter. إذا كان إعلان العنصر كان -(revst|revend), ، هذا يعني ذلك revst أو revend هو ليس مسموح به في أي مكان داخل chapter.

أتمنى أن يساعدك هذا.

نصائح أخرى

نعم ، استخدم نوكوجيري.

قم بالتمرير لأسفل قليلاً على تلك الصفحة ونسخ الكود ضمن "ملخص" إلى ملف ، على سبيل المثال xml-parser.rb. ثم ، إذا كنت على جهاز Mac (يأتي Ruby بالفعل على Macs.) ، من Terminal ، قم بالتشغيل gem install nokogiri, ، ثم قم بتشغيل الملف بـ: ruby xml-parser.rb.

يمكنك أيضًا الكتابة irb مباشرة من المحطة ثم require 'nokogiri' وابدأ في اللعب مع API Nokogiri في الوقت الفعلي. فلدي الحب التفاعلية روبي. قون

إذا كنت على Windows ، جرب هذا تثبيت روبي لنظام التشغيل Windows.

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