Нажмите "Enter", чтобы перейти к содержанию

Редактировать xml: Как открывать, редактировать и конвертировать файлы XML

python — Прошу помощи в автоматизации редактирования файла *.xml

Вопрос задан

Изменён 1 год 1 месяц назад

Просмотрен 180 раз

Здравствуйте уважаемые участники сообщества!

Передо мной стоит задача в уменьшении файла безопасности OVAL с целью оптимизации проверки и уменьшении нагрузки на серверные мощности. Он имеет формат xml, внушительный размер 164Mb и довольно понятную структуру, сейчас я постараюсь всё подробно описать.

<defenitions>
  <definition....>
    .....
  </defenition>
</defenitions>
<tests>
  <rpminfo_test ..... >
    .....
  </rpminfo_test>
</tests>
<object>
  <rpminfo_object ..... >
    .....
  </rpminfo_object>
</object>
<states>
  <rpminfo_state .
.. > ..... </rpminfo_state> </states>

Так вот нужно найти блоки в которых XXXXXXXX меньше определённого значения и удалить полностью его содержимое, вместе с тегами.

Вот например в блоке < defenitions> содержится огромное количество подблоков < defenition> каждый со своим id. И если его id меньше 20170000, то его нужно удалить полностью и повторить операцию со следующим блоком. А в блоке < tests> и в следующих двух поисковым числом должно быть 2017000000.

Помогите написать скрипт на python, использоваться он будет на SUSE Linux Enterprise


Небольшой кусочек файла до запуска скрипта

<?xml version="1.0" encoding="UTF-8"?>
    <oval_definitions
        xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux "
        xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5"
        xmlns:oval-def="http://oval.
mitre.org/XMLSchema/oval-definitions-5"> <generator> <oval:product_name>Marcus Updateinfo to OVAL Converter</oval:product_name> <oval:schema_version>5.5</oval:schema_version> <oval:timestamp>2022-04-27T06:04:52</oval:timestamp> </generator> <definitions> <definition version="1"> <metadata> <title>CVE-1999-0524</title> #Дальше идёт много строчек текста/кода обрезал их из-за большого количества символов </metadata> </definition> <definition version="1"> <metadata> <title>CVE-2000-1254</title> #Дальше идёт много строчек текста/кода обрезал их из-за большого количества символов </metadata> </definition> <definition version="1"> <metadata> <title>CVE-2017-0405</title> #Дальше идёт много строчек текста/кода обрезал их из-за большого количества символов </metadata> </definition> </definitions> <tests> <rpminfo_test version="1" comment="kernel-default is ==0" check="all" xmlns="http://oval.
mitre.org/XMLSchema/oval-definitions-5#linux"> <object object_ref="oval:org.opensuse.security:obj:2009030416"/> <state state_ref="oval:org.opensuse.security:ste:2009079458"/> </rpminfo_test> <rpminfo_test version="1" comment="sled-release is ==15" check="at least one" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"> <object object_ref="oval:org.opensuse.security:obj:2017031917"/> <state state_ref="oval:org.opensuse.security:ste:2017061809"/> </rpminfo_test> </tests> <objects> <rpminfo_object version="1" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"> <name>kernel-default</name> </rpminfo_object> <rpminfo_object version="1" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"> <name>kernel-source</name> </rpminfo_object> </objects> <states> <rpminfo_state version="1" xmlns="http://oval.
mitre.org/XMLSchema/oval-definitions-5#linux"> <version operation="equals">0</version> </rpminfo_state> <rpminfo_state version="1" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"> <version operation="equals">15</version> </rpminfo_state> </states> </oval_definitions>

А вот это я хочу видеть после отрабатывания скрипта

<?xml version="1.0" encoding="UTF-8"?> <oval_definitions xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux " xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-def="http://oval.mitre.org/XMLSchema/oval-definitions-5"> <generator> <oval:product_name>Marcus Updateinfo to OVAL Converter</oval:product_name> <oval:schema_version>5. 5</oval:schema_version> <oval:timestamp>2022-04-27T06:04:52</oval:timestamp> </generator> <definitions> <definition version="1"> <metadata> <title>CVE-2017-0405</title> #Дальше идёт много строчек текста/кода обрезал их из-за большого количества символов </metadata> </definition> </definitions> <tests> <rpminfo_test version="1" comment="sled-release is ==15" check="at least one" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"> <object object_ref="oval:org.opensuse.security:obj:2017031917"/> <state state_ref="oval:org.opensuse.security:ste:2017061809"/> </rpminfo_test> </tests> <objects> <rpminfo_object version="1" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"> <name>kernel-source</name> </rpminfo_object> </objects> <states> <rpminfo_state version="1" xmlns="http://oval.
mitre.org/XMLSchema/oval-definitions-5#linux"> <version operation="equals">15</version> </rpminfo_state> </states> </oval_definitions>

Как уже видно не осталось блоков с id меньше 2017000000

  • python
  • xml
5

Пожалуйста, попробуйте следующий XSLT.

Оно использует так называемый Identity Transform шаблон.

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:oval-def="http://oval.mitre.org/XMLSchema/oval-definitions-5"
    xmlns:ns2="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5">
    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <!--delete not needed elements based on the trailing @id value-->
    <xsl:template match="oval-def:definition[number(substring(@id,32,8)) &lt; 20170000]" />
    <xsl:template match="ns2:rpminfo_test[number(substring(@id,32,10)) &lt; 2017000000]" />
    <xsl:template match="ns2:rpminfo_object[number(substring(@id,32,10)) &lt; 2017000000]" />
    <xsl:template match="ns2:rpminfo_state[number(substring(@id,32,10)) &lt; 2017000000]" />
</xsl:stylesheet>

Python

import os
import lxml. etree as ET
import sys
if sys.version_info[0] >= 3:
    unicode = str
inputfile = "D:\\temp\\input.xml"
xsltfile = "D:\\temp\\process.xslt"
outfile = "D:\\output\\output.xml"
dom = ET.parse(inputfile)
xslt = ET.parse(xsltfile)
transform = ET.XSLT(xslt)
newdom = transform(dom)
infile = unicode((ET.tostring(newdom, pretty_print=True)))
outfile = open(outfile, 'a')
outfile.write(infile)
8

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Изменение XML-описания виртуальной машины

XML-описание передаётся libvirt при создании и редактировании виртуальной машины. На последнем этапе перед передачей XML в libvirt выполняется обработчик editxml. Добавив плагин на данный обработчик, можно изменять XML-описание виртуальной машины. В VMmanager внесённые изменения учитываются.

Входные параметры обработчика:

  • vmi — наименование шаблона ОС;
  • hostnode — идентификатор узла кластера, на котором расположена виртуальная машина.

XML для libvirt находится в теге «/doc/outxml». VMmanager также считает XML из тега «/doc/outxml».


Задача

Необходимо добавить в XML тэги «pm» (Power Management).

...
<pm>
  <suspend-to-disk enabled='yes'/>
  <suspend-to-mem enabled='yes'/>  
</pm>
...

BASH

Также необходимо для шаблона ОС с именем «SlitazOs» найти все виртуальные диски типа «block» и изменить тип кэширования на «writeback».

Решение

Нужно создать файл описания обработчика и сохранить его в директорию /usr/local/mgr5/etc/xml.

Файл /usr/local/mgr5/etc/xml/vmmgr_mod_pm.xml:

<mgrdata>
  <handler name="editxml_pm.py" type="xml">
  <event name="editxml" after="yes"/>
</handler>
</mgrdata>

BASH

Нужен скрипт editxml_pm.py, который должен находиться в /usr/local/mgr5/addon.

Файл /usr/local/mgr5/addon/editxml_pm.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import xml.etree.ElementTree as ET
# Содержимое сессии VMmanager в виде XML-файла
sesXmlContent = sys.stdin.read()
ses = ET.fromstring(sesXmlContent)
# Получить наименование шаблона ОС
vmi = ses.find("./vmi").text
# Получить ID узла кластера
hostNodeId = ses.find("./hostnode").text
# Оригинальный xml виртуальной машины
domainXmlString = ses.find("./outxml").text
domainXml = ET. fromstring(domainXmlString)
# Получить имя виртуальной машины
domainName = domainXml.find("./name").text
# Исправляем XML только для шаблона SlitazOs
if vmi == "SlitazOs":
    # Добавим тег <pm> (Power Management)
    pm = ET.SubElement(domainXml, "pm")
    suspendToDisk = ET.SubElement(pm, "suspend-to-disk", {"enabled": "yes"})
    suspendToMem = ET.SubElement(pm, "suspend-to-mem", {"enabled": "yes"})
    # Поиск всех подключенных дисков
    disks = domainXml.findall("./devices/disk")
    for diskNode in disks:
        # Получаем тип виртуального диска (file, network, block, volume)
        diskType = diskNode.get("type")
        # Исправляем только для типа "block"
        if diskType == "block":
            # Устанавливаем тип кэша "writeback"
            driver = diskNode.find("driver")
            driver.set("cache", "writeback")
# Формируем XML для вывода
newDomContent = ET.tostring(domainXml, "UTF-8")
ses.find("./outxml").text = newDomContent
# Вывод XML
sys.stdout.write(ET. tostring(ses, "UTF-8"))

BASH

Для файла /usr/local/mgr5/addon/editxml_pm.py установите права на запуск:

chmod +x /usr/local/mgr5/addon/editxml_pm.py

BASH

После этого перезапустите VMmanager:

killall core

BASH

При запуске VMmanager в логе vmmgr.log должна появиться строка:

Dec  9 06:48:45 [15118:1] action EXTINFO Register event 'editxml_pm.py' for action 'editxml'

BASH

Наличие данной строки означает, что плагин готов к обработке. Теперь при любом редактировании виртуальной машины плагин отработает и изменит соответствующим образом XML-описание виртуальной машины.

Перегенерирование XML-описания виртуальной машины, без редактирования в панели управления, выполняется с помощью команды:

/usr/local/mgr5/sbin/mgrctl -m vmmgr vm.redefine elid=<VM_ID>

BASH

Easy XML Editor — Программное обеспечение XML

Зачем использовать Easy XML Editor

1. Это не текстовый редактор

В то время как обычные XML-редакторы обычно являются модификацией текстовых редакторов, Easy XML Editor отличается от них. Он обрабатывает XML-файлы так, как они есть. : Иерархическая композиция узлов, у которых есть дочерние элементы и атрибуты.

При работе с файлами XML вы хотите структурировать содержимое с помощью этих инструментов. Соблюдение синтаксиса с открывающими и закрывающими тегами элементов считается обязательным. Редактор Easy XML освободит вас от этого, этот снижает потребность в наборе , и вы можете сосредоточиться на содержании.

Это редактор, предназначенный для работы с файлами XML, с функциями , которые текстовый редактор не может предоставить .

2. Редактор Easy XML предотвращает синтаксические ошибки

При работе с древовидным представлением редактор гарантирует, что синтаксис всегда правильный .

Это устраняет необходимость, например. убедитесь, что элемент закрыт правильно.

3. Он структурирует ваши данные

При работе с простым кодом XML вам всегда нужно следить за правильной структурой XML . В сложных файлах это может быть утомительной задачей, Easy XML Editor освобождает вас от этой работы. XML-данные представлены в понятной и удобной форме , например реструктуризацию можно выполнить с помощью перетаскивания, а данные можно отобразить в виде таблиц.

Возможности

Easy XML Editor представляет собой удобный редактор файлов XML . С его помощью вы можете просматривать и редактировать XML-данные новым, упрощенным способом.

1. Дерево

Easy XML Editor отображает XML-файлы в виде дерева узлов , каждый элемент/комментарий/cdata/инструкция по обработке является узлом. Это упрощает обзор сложных структур данных.

Данные можно редактировать прямо в дереве :

Уже известных имен перечислены на выбор, это ограничивает необходимость ввода:

2. Простое редактирование

Easy XML Editor предоставляет упрощенных способов редактирования содержимого XML . Модификации с использованием текстовых полей — одна из возможностей.

3. Редактирование кода XML (с подсветкой синтаксиса)

Несмотря на внимание к дереву, Код XML можно редактировать напрямую . Представление в виде дерева и текстовое представление могут отображаться одновременно.

4. Редактирование таблиц

XML-данные могут быть сопоставлены с таблицами , структура таблицы определяется в секундах.
Здесь в качестве примера показана структура данных и ее табличное представление:

Там можно редактировать данные понятно и удобно , изменения сразу применяются к дереву.

5. Отслеживание изменений/история

Если вы хотите, каждое изменение в XML-дереве помечается и сохраняется в так называемой истории . Это упрощает отслеживание изменения , которые вы применили, с возможностью отменить некоторые или все из них.

6. Поиск/Замена

Easy XML Editor позволяет выполнять полнотекстовых поисков по XML-дереву, результаты отображаются в удобном для обработки списке.
Щелчок по элементу списка приведет к переходу к примененному изменению.

7. Функция копирования

Функция копирования позволяет копировать выбранные узлы в буфер обмена. Оттуда его можно вставить везде, где вам это нужно.

Копирование дерева выше приведет к :

8. Экспорт в HTML

Как описано в пункте 4, Easy XML Editor может отображать XML-данные в таблицы. Этих таблиц может быть экспортируется в буфер обмена или в файл .csv («Значения, разделенные запятыми») .

В этом примере показаны данные, экспортированные в приложение для работы с электронными таблицами:

9. Инструмент «Модификатор»

Этот инструмент позволяет выразить несколько условий и действий , если, например. все условия соблюдены для элемента определенные действия применяются к элементу. Это упрощает переработку/корректировку XML-данных .

Полное описание функций Easy XML Editor

Полное описание функций Easy XML Editor можно найти в Руководстве по Easy XML Editor: Руководство по простому редактору XML.

Бесплатно: XML Helper

Вместе с покупкой лицензии вы получите инструмент XML Helper бесплатно.

Диалоговое окно редактирования XML-файла

В этом диалоговом окне можно настроить XML-файл. Вы можете создавать и редактировать элементы и атрибуты, изменять структуру XML и другие.



Управление общими настройками файла XML

Выберите файл XML в левом дереве, и вы сможете изменить общие настройки файла в файле Вкладка «Настройки».

Управление параметрами установки файла XML

Выберите файл XML в левом дереве. Параметры установки можно изменить из Install вкладка

Создание нового XML-элемента

Используйте пункт контекстного меню «Новый элемент» или нажмите клавишу Insert, пока существующий XML-элемент выбранный в дереве для создания дочернего узла. Недавно созданный элемент имеет элемент Вкладка «Настройки» и вкладка «Атрибуты».

Создание нового XML-комментария

Используйте пункт контекстного меню «Новый комментарий». Недавно созданный элемент имеет вкладку «Комментарий». На этой вкладке в разделе «Текст» поле, вы можете указать текст комментария.

Эта строка имеет форматированный тип и может редактировать с помощью Smart Edit Control.

Создание нового удаления элемента XML

Используйте пункт контекстного меню «Удаление нового элемента». Вы можете настроить эту операцию на вкладке Удаление элемента.

Переименование XML-элемента или комментария

Используйте пункт контекстного меню «Переименовать» или нажмите кнопку Клавиша F2 при выборе элемента дерева.

Удаление XML-элемента или комментария

Используйте пункт контекстного меню «Удалить» или нажмите кнопку Удалить ключ, пока элемент дерева выбрано.

Корневой элемент не может быть удален и должен соответствовать корневому элементу обновляемого файла (если есть).

Перемещение элемента XML вверх, вниз, влево или вправо

Используйте кнопки «Вверх», «Вниз», Контекстное меню дерева «Переместить влево» или «Переместить вправо» элементы или нажмите Shift + Up, Shift + Вниз, Shift + Влево или Shift + Верно. При движении влево элемент будет перемещаться после последнего элемента его родительского элемента. При движении вправо, элемент будет перемещен после последнего дочернего элемента элемента перед этим. Вы также можете перемещать элементы и комментарии по перетаскивание .

Если элемент или компонент перетаскивается при Клавиша Shift нажата, это будет скопировал в новое место, а не переехал . Все его дочерние элементы и атрибуты будут также скопируйте (дубликат) .

  • Порядок , в котором элементы появляются в дереве, очень важно, так как он используется в процессе обновления XML и должен соответствовать порядку элементов из XML-файла, обновлено.
  • Вы можете массово редактировать или удалять элементы, выбирая их в дереве используя Ctrl+щелчок или Shift+щелчок по ярлыкам.

Экранирование специальных символов XML

Подробнее об экранированных символах XML.

  • Вкладка «Параметры файла XML»
    Настройте общие параметры файла XML.

Ваш комментарий будет первым

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *