скрипт для перевода xml в json

Btrfs использует контрольные суммы crc32c для проверки целостности блоков. Если контрольная сумма не соответствует блоку при чтении, то читается альтернативный блок. Предполагается, что есть альтернатива (RAID1). Если этот блок также выходит из строя или нет альтернативы, возвращается EIO (ввод / вывод ошибки).

Я не знаю никакого способа автоматического обнаружения ошибок, но все ошибки записываются в системный журнал. Попробуйте dmesg | grep btrfs . Вы должны искать что-то вроде этого:

[ 2993.114213] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0
[ 2993.114527] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0
[ 2993.114795] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0
[ 2993.115097] btrfs: sda2 checksum verify failed on 272228352 wanted 1A0FCFD3 found 119281BE level 0

Вы, вероятно, могли бы создать сценарий или сценарий, который просматривает журналы и регулярно уведомляет вас об ошибках. Или вы можете отфильтровать эти записи журнала и запустить действие rsyslog.

-3
07.03.2019, 12:28
3 ответа

Я предполагаю, что в вашей Ubuntu установлен Python

#!/usr/bin/python3
import io
import json
import xml.etree.ElementTree

d = """<quiz>
        <que>The question her</que>
        <ca>text</ca>
        <ia>text</ia>
        <ia>text</ia>
        <ia>text</ia>
    </quiz>
"""

s = io.StringIO(d)
# root = xml.etree.ElementTree.parse("filename_here").getroot()
root = xml.etree.ElementTree.parse(s).getroot()
out = {}
i = 1
for child in root:
    name, value = child.tag, child.text
    if name == 'que':
        name = 'question'
    else:
        name = 'answer%s' % i
        i += 1
    out[name] = value

print(json.dumps(out))

сохраните его и chmodв исполняемый файл вы можете легко изменить, чтобы в качестве входных данных использовался файл, а не просто текст

РЕДАКТИРОВАТЬ Хорошо, это более полный сценарий:

#!/usr/bin/python3
import json
import sys
import xml.etree.ElementTree


def read_file(filename):
    root = xml.etree.ElementTree.parse(filename).getroot()
    return root


# assule we have a list of <quiz>, contained in some other element
def parse_quiz(quiz_element, out):
    i = 1
    tmp = {}
    for child in quiz_element:

        name, value = child.tag, child.text
        if name == 'que':
            name = 'question'
        else:
            name = 'answer%s' % i
            i += 1
        tmp[name] = value
    out.append(tmp)


def parse_root(root_element, out):
    for child in root_element:
        if child.tag == 'quiz':
            parse_quiz(child, out)


def convert_xml_to_json(filename):
    root = read_file(filename)
    out = []
    parse_root(root, out)
    print(json.dumps(out))


if __name__ == '__main__':
    if len(sys.argv) > 1:
        convert_xml_to_json(sys.argv[1])
    else:
        print("Usage: script <filename_with_xml>")

Я сделал файл со следующим, который я назвалxmltest:

<questions>
    <quiz>
        <que>The question her</que>
        <ca>text</ca>
        <ia>text</ia>
        <ia>text</ia>
        <ia>text</ia>
    </quiz>
     <quiz>
            <que>Question number 1</que>
            <ca>blabla</ca>
            <ia>stuff</ia>
    </quiz>
</questions>

Итак, у вас есть список quizвнутри какого-то другого контейнера.

Теперь запускаю вот так :$ chmod u+x scratch.py, затемscratch.py filenamewithxml

Это дает мне ответ:

$./scratch4.py xmltest
[{"answer3": "text", "answer2": "text", "question": "The question her", "answer4": "text", "answer1": "text"}, {"answer2": "stuff", "question": "Question number 1", "answer1": "blabla"}]
3
28.01.2020, 05:18

на самом деле здесь можно обойтись даже без программирования на Python, просто используя 2 утилиты unix:

  1. jtm-разрешается преобразование xml < -> json без потерь
  2. jtc-позволяет манипулировать JSON

Таким образом, если ваш xml находится в file.xml, jtm преобразует его в следующий json:

bash $ jtm file.xml 
[
   {
      "quiz": [
         {
            "que": "The question her"
         },
         {
            "ca": "text"
         },
         {
            "ia": "text"
         },
         {
            "ia": "text"
         },
         {
            "ia": "text"
         }
      ]
   }
]
bash $ 

а затем, применив ряд преобразований JSON, можно прийти к желаемому результату:

bash $ jtm file.xml | jtc -w'<quiz>l:[1:][-2]' -ei echo { '"answer[-]"': {} }\; -i'<quiz>l:[1:]' | jtc -w'<quiz>l:[-1][:][0]' -w'<quiz>l:[-1][:]' -s | jtc -w'<quiz>l:' -w'<quiz>l:[0]' -s | jtc -w'<quiz>l: <>v' -u'"text"'
[
   {
      "answer1": "text",
      "answer2": "text",
      "answer3": "text",
      "answer4": "text",
      "text": "The question her"
   }
]
bash $ 

Тем не менее, из-за того, что команда )использует сценарии оболочки (echo, она будет медленнее, чем Python -для 5000 вопросов, я ожидаю, что она будет выполняться около минуты. (В будущей версии jtcя планирую разрешить интерполяции даже в статически заданных JSON, чтобы для шаблонизации не требовалось скриптов внешней оболочки -, тогда операции будут выполняться молниеносно)

если вас интересует синтаксис jtc, вы можете найти руководство пользователя здесь:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md

3
28.01.2020, 05:18

Спасибо, dgan, но ваш код :1 -вывести вывод на экран не в файл json и не поддерживать кодировку = utf -8, поэтому я изменил его:

 ##!/usr/bin/python3
import json, codecs
import sys
import xml.etree.ElementTree


def read_file(filename):
    root = xml.etree.ElementTree.parse(filename).getroot()
    return root


# assule we have a list of <quiz>, contained in some other element
def parse_quiz(quiz_element, out):
    i = 1
    tmp = {}
    for child in quiz_element:

        name, value = child.tag, child.text
        if name == 'que':
            name = 'question'
        else:
            name = 'answer%s' % i
            i += 1
        tmp[name] = value
    out.append(tmp)


def parse_root(root_element, out):
    for child in root_element:
        if child.tag == 'quiz':
            parse_quiz(child, out)


def convert_xml_to_json(filename):
    root = read_file(filename)
    out = []
    parse_root(root, out)
    with open('data.json', 'w') as outfile:
        json.dump(out, codecs.getwriter('utf-8')(outfile), sort_keys=True, ensure_ascii=False)


if __name__ == '__main__':
    if len(sys.argv) > 1:
        convert_xml_to_json(sys.argv[1])
    else:
        print("Usage: script <filename_with_xml>")

`

0
28.01.2020, 05:18

Теги

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