Формат структурированных данных в XML

Имена файлов и т. д. разбросаны по диску в инодах, так что они (большинство из них, некоторые могли быть в обнуленной части )все еще должны быть.

Другое дело, как их найти. Когда корневой индекс потерян, я не думаю, что есть какой-либо способ узнать, какие блоки содержат индексы, это означает, что вы остаетесь с программами, которые читают необработанные блоки данных и угадывают, какие из них что, а индексы, вероятно, трудно найти. определить, я понятия не имею, может ли это сделать какая-либо программа (Я не слышал об этом ).

0
16.01.2020, 15:22
2 ответа

Так как ваш формат ввода не соответствует -стандарту, вам нужно написать парсер для его обработки. Существует два подхода :вы можете написать его "вручную" на любом процедурном языке программирования (, как правило, в качестве верхнего -рекурсивного спускового синтаксического анализатора ), или вы можете использовать какой-либо генератор синтаксических анализаторов. В последнем подходе вы определяете BNF грамматики вашего ввода, и инструмент строит синтаксический анализатор для вас. Если вы можете использовать Scala, это очень упрощает задачу.

Другим генератором синтаксических анализаторов, часто используемым в мире XML, является REx -. Он удобен тем, что генерирует синтаксический анализатор в XQuery или XSLT, что значительно упрощает задачу генерации XML; это отличная программа, но, к сожалению, она очень плохо документирована. Другим инструментом, ориентированным на XML -, является «Invisible XML» Стивена Пембертона (https://homepages.cwi.nl/~steven/ixml/)--. Если REx — отличное программное обеспечение с плохой документацией, то Invisible XML, к сожалению, — отличная документация с небольшим количеством опубликованного программного обеспечения.

Еще один дешевый -и -веселый подход приходит мне на ум :с довольно простым сценарием редактора, основанным на регулярных выражениях, вы можете:

  • заключайте имена в кавычки и добавляйте завершающее двоеточие
  • заменить точки с запятой на запятые

и тогда у вас будет что-то, что многие парсеры JSON примут (это не совсем соответствует, потому что ваши точки с запятой являются терминаторами, а не разделителями, но многие парсеры JSON допускают это.)

1
28.01.2020, 02:38

Ниже приведена простая awkпрограмма, которая предполагает, что данные выглядят точно так же, как вы показываете, т. е. что

  1. открывающие «теги» находятся в строках, которые содержат только метку и {,
  2. строк с данными содержат точно метку, за которой следует одно слово и ;, и что
  3. каждое }встречается в строках, на которых больше ничего нет.

Он использует стек для отслеживания того, с каким тегом он работает в данный момент, и помещает в стек новые теги, когда они встречаются во входных данных. Когда найден }, выводится конечный тег для вершины стека. Строки данных обнаруживаются по тому факту, что они не заканчиваются ни одиночным символом {, ни символом }.

Никаких попыток проверки данных не предпринимается.

$NF == "{" {
        stack[++top] = $1                       # push tag to stack
        printf "<%s>\n", stack[top]             # output opening tag
        next
}

$NF == "}" {
        printf "</%s>\n", stack[top--]          # output closing tag + pop stack
        next
}

{
        sub(";$", "", $2)                       # remove ; from EOL
        printf "<%s>%s</%s>\n", $1, $2, $1      # output tag with data
}

Для вашего примера данных awk -f script.awk data.inдает

<unknown-applications>
<unknown-tcp>
<destinations-per-hour>10</destinations-per-hour>
<sessions-per-hour>10</sessions-per-hour>
<session-length>
<maximum-bytes>100</maximum-bytes>
<minimum-bytes>50</minimum-bytes>
</session-length>
</unknown-tcp>
<unknown-udp>
<destinations-per-hour>10</destinations-per-hour>
<sessions-per-hour>10</sessions-per-hour>
<session-length>
<maximum-bytes>100</maximum-bytes>
<minimum-bytes>50</minimum-bytes>
</session-length>
</unknown-udp>
</unknown-applications>

, который при прогоне через xmlstarlet foпревращается в

<?xml version="1.0"?>
<unknown-applications>
  <unknown-tcp>
    <destinations-per-hour>10</destinations-per-hour>
    <sessions-per-hour>10</sessions-per-hour>
    <session-length>
      <maximum-bytes>100</maximum-bytes>
      <minimum-bytes>50</minimum-bytes>
    </session-length>
  </unknown-tcp>
  <unknown-udp>
    <destinations-per-hour>10</destinations-per-hour>
    <sessions-per-hour>10</sessions-per-hour>
    <session-length>
      <maximum-bytes>100</maximum-bytes>
      <minimum-bytes>50</minimum-bytes>
    </session-length>
  </unknown-udp>
</unknown-applications>
0
28.01.2020, 02:38

Теги

Похожие вопросы