Добавление отсутствующих закрывающих тегов XML в Javascript - PullRequest
0 голосов
/ 21 мая 2018

Мне нужно проанализировать внешние файлы с приведенной ниже структурой, используя Node.js.

<ISSUER>
<COMPANY-DATA>
<CONFORMED-NAME>EXACTECH INC
<CIK>000012345
<ASSIGNED-SIC>9999
<IRS-NUMBER>8979898988
<STATE-OF-INCORPORATION>FL
<FISCAL-YEAR-END>1231
</COMPANY-DATA>
<BUSINESS-ADDRESS>
<STREET1>22W 56TH COURT
<CITY>GAINSVILLE
<STATE>FL
<ZIP>32653
<PHONE>999-999-9999
</BUSINESS-ADDRESS>
<MAIL-ADDRESS>
<STREET1>22W 56TH COURT
<CITY>GAINSVILLE
<STATE>FL
<ZIP>32653
</MAIL-ADDRESS>
</ISSUER>

Блоки имеют закрывающие теги, а отдельные строки - нет.Как добавить отсутствующие закрывающие теги, чтобы я мог проанализировать XML?

У меня нет контроля над генерацией XML-файла, поэтому я не могу исправить его в источнике.

Это похоже наэта реализация Java: Синтаксический анализ XML без закрывающих тегов в Java

1 Ответ

0 голосов
/ 22 мая 2018

Ваши данные выглядят как SGML, расширенный набор XML, позволяющий выводить / пропускать теги.Я нахожусь в процессе выпуска парсера SGML для JavaScript (для браузера, node.js и других платформ CommonJS), но он еще не выпущен.В настоящее время я предлагаю использовать почтенное программное обеспечение OpenSP, которое не имеет пакета интеграции npm, но которое вы можете легко установить, например.Ubuntu / Debian, использующий sudo apt-get install opensp и аналогичный на других Linuxen и на Mac OS через MacPorts.

Пакет OpenSP содержит утилиту командной строки osx для преобразования SGML в XML.Вы можете использовать базовый пакет узла child_process для вызова программы osx, передачи по ней ваших данных SGML, а также получения полученного в результате XML-результата и передачи полученного XML в анализатор XML по вашему выбору в приложении узла..

SGML и программе osx необходимо указать добавить пропущенные теги конечных элементов для CONFORMED-NAME, CIK и другие элементы с пропущенными тегами конечных элементов.Это можно сделать, добавив объявление типа документа (DTD) перед содержимым SGML.В вашем случае, то, что вы предоставляете программе osx, должно выглядеть следующим образом:

<!DOCTYPE ISSUER [
  <!ELEMENT ISSUER - -
     (COMPANY-DATA,BUSINESS-ADDRESS,MAIL-ADDRESS)>
  <!ELEMENT COMPANY-DATA - -
     (CONFORMED-NAME,CIK,ASSIGNED-SIC,IRS-NUMBER,
       STATE-OF-INCORPORATION,FISCAL-YEAR-END)>
  <!ELEMENT (BUSINESS-ADDRESS,MAIL-ADDRESS) - -
     (STREET1,CITY,STATE,ZIP)>
  <!ELEMENT
     (CONFORMED-NAME,CIK,ASSIGNED-SIC,IRS-NUMBER,
       STATE-OF-INCORPORATION,FISCAL-YEAR-END,
       STREET1,CITY,STATE,ZIP) - O (#PCDATA)>
]>
<ISSUER> ... rest of your input data followin here

В сущности, объявление для CONFORMED-NAME, CIK и других полевых элементов использует - O (дефис-минус и буква O) как индикаторы пропуска тегов , указывающие SGML, что теги конечных элементов для этих элементов могут быть опущены и будут автоматически вставлены программой osx.

Подробнее о значении этих объявлений вы можете прочитать на странице моего проекта по адресу http://sgmljs.net/docs/sgmlrefman.html.

...