Стратегия по разбору лотов и множество не так хорошо сформированных SGML / XML-документов

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

Вопрос

У меня есть тысячи документов SGML, некоторые хорошо сформированные, некоторые не так хорошо сформированы. Мне нужно добраться на определенные элементы в документах, но каждый раз, когда я собираюсь загрузить и пытаться прочитать их в XDocument, XMLDocument или даже просто leapreader, я получаю разные ошибки XMLexception.

Такие вещи, такие как «« [»- неожиданный токен». Почему? Потому что у меня есть документ с доцинским

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

И я узнал, что «[]» необходимо иметь что-то действительное внутри. Опять же, я не контролирую создание документов, но мне нужно «взломать» их и получить данные, которые я хочу. Другим примером является «неразлым» элемент, например:

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

Это XMLEXCECTION - это «Начальный тег« дефис »на линии 27, не соответствует конечному метку« заголовок ». Линия 27, позиция 58." Очевидно, верно?

Но тогда вопрос в том, как вы можете на самом деле получить на определенные элементы в этих документах, не сталкиваясь с XMLExceptions. Sax Parser правильный путь? Я в основном хочу открыть документ, идите направо на элемент, который я хочу (не беспокоясь, что может или не может быть хорошо сформирован рядом), вытащить данные и двигаться дальше. Должен ли я просто забыть разборы с XMLDocument, XDocument и просто делать простые строковые замены, такие как

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

а затем попробуйте загрузить его в один из анализаторов XML. Любые советы по стратегиям?

Это было полезно?

Решение

Вопрос в том, что вы пытаетесь проанализировать SGML с помощью инструмента XML. Они не одинаковы. Если вы хотите использовать инструмент / язык XML для доступа к данным, вам, вероятно, понадобится преобразовать SGML в XML, прежде чем пытаться разбирать его.

В идеале вы бы либо использовали язык / инструмент, который поддерживает SGML (например, Omnimark) или что-то, что может обрабатывать «XML Like» данных (например, Nokogiri из первого ответа?).

Это может быть довольно прямо вперед, но может быть сложно в некоторых очках. Особенно, если вы говорите о нескольких дочинках (DTD). (Кроме того, нет такой вещи, как «хорошо сформированное» SGML. Да, элементы / и т. Д. Должны быть правильно вложены, но SGML имеет иметь DTD.)

Вот некоторые различия между SGML и XML, которые вам нужно будет обрабатывать. (Вы не можете хотеть идти по этому маршруту, но в любом случае может быть полезным для информационных целей.):

  1. Декларация Досмотра

    Декларация DOCTYPE в вашем примере является совершенно действительным Doctype SGML. То [] (внутреннее подмножество) не нужно ничего иметь в этом. Если у вас есть декларации во внутреннем подмножестве (обычно декларациях на объект), вы более чем вероятность того, чтобы придержать декларацию Doctype в XML.

    Проблема XML Parser имеет то, что у вас нет идентификатора системы в декларации. В объявлении Doctype XML идентификатор системы требуется, если есть публичный идентификатор. В объявлении Doctype SGML это не требуется.

    Нижняя линия: Если вам не нужен 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) в SGML не имеют второго ? Когда они закрыты, как XML. Вам нужно добавить второй ?.

    Пример sgml pi: <?asdf jkl>

    Пример xml pi: <?asdf jkl?>

  4. Включения / исключения

    Возможно, вам, вероятно, не придется беспокоиться об этом, но в SGML DTD вы можете указать в объявлении элемента, что другой элемент разрешен в любом месте внутри этого элемента (или не допускается). Это может быть боль, если ваша целевая XML нуждается в анализе DTD; XML DTD не разрешают включения / исключения.

    Это то, как может выглядеть включение:

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

    Это говорит, что revst или revend допускаются в любом месте внутри chapter. Отказ Если Декларация Элемента имела -(revst|revend), это будет означать, что revst или revend является нет допускается в любом месте внутри chapter.

Надеюсь это поможет.

Другие советы

Да, используйте Нокогири.

Прокрутите немного на этой странице и скопируйте код под «Синопсис» в файл, скажите xml-parser.rb. Отказ Тогда, если вы на Mac (Ruby приходит уже установлен на Macs.), От терминала запустить gem install nokogiri, а затем запустите файл с: ruby xml-parser.rb.

Вы также можете тогда ввести irb прямо с терминала, а затем require 'nokogiri' И начните играть с API Nokogiri в режиме реального времени. Должен любить интерактивный рубин. :)

Если вы находитесь в Windows, попробуйте это Установщик Ruby для Windows.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top