Похудение на xml
У меня есть программа, производящая один большой xml каждый день, и я хочу сэкономить место, и есть некоторая информация, которая не полезна через некоторое время. Я хочу удалить эту информацию, например, мой xml:
<owner name="thename"> <datasets ndatasets="10" size="10000"> <dataset size="100" creationdate="...">mydataset1</dataset> <dataset size="200" creationdate="...">mydataset2</dataset> ... </datasets> </owner> <owner name="thename2"> ... </owner>
Я хочу удалить информацию об отдельных наборах данных, поэтому я хочу преобразовать ее в:
<owner name="thename"> <datasets ndatasets="10" size="10000" /> </owner> <owner name="thename2"> ... </owner>
Какой самый простой способ сделать это? Я использую python, но также приветствуются и другие простые и портативные решения.
- Минимизировать / сжать javascript и css при развертывании в webapp2?
- Раскройте строку Zlib при использовании ByteArrays
- Измерение эффективности кодирования Хаффмана с битовой строкой Python
- Сжатие с лучшим соотношением в Python?
- Модуль zipfile Python не сжимает файлы
Решение XSLT ( решение Sean – это хорошо, но оно перестало бы работать, если бы элементы или узлы, которые были datasets
dataset
были сделаны datasets
):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="datasets/node()"/> </xsl:stylesheet>
Когда это преобразование применяется к предоставленному скелетному XML (завернутому в один верхний элемент, чтобы сделать его хорошо сформированным XML-документом):
<t> <owner name="thename"> <datasets ndatasets="10" size="10000"> <dataset size="100" creationdate="...">mydataset1</dataset> <dataset size="200" creationdate="...">mydataset2</dataset> </datasets> </owner> <owner name="thename2"> <datasets ndatasets="10" size="10000"> <dataset size="100" creationdate="...">mydataset1</dataset> <dataset size="200" creationdate="...">mydataset2</dataset> </datasets> </owner> </t>
получается желаемый, правильный результат:
<t> <owner name="thename"> <datasets ndatasets="10" size="10000"/> </owner> <owner name="thename2"> <datasets ndatasets="10" size="10000"/> </owner> </t>
Объяснение :
Правильное использование правила идентификации и переопределение его с помощью шаблона пустого тела, соответствующего любому дочернему узлу datasets
.
Вот таблица стилей XSLT 1.0:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="dataset" /> </xsl:stylesheet>
Вот несколько указателей, которые помогут вам начать путешествие по XSLT:
Я думаю, что ответ @Sean B. Durkin проще, но если вы хотите сделать это с помощью lxml
:
from lxml import etree from StringIO import StringIO xml = etree.parse(StringIO('''<owner name="thename"> <datasets ndatasets="10" size="10000"> <dataset size="100" creationdate="...">mydataset1</dataset> <dataset size="200" creationdate="...">mydataset2</dataset> </datasets> </owner>''')) [d.getparent().remove(d) for d in xml.findall('.//dataset')] print etree.tostring(xml, pretty_print=True)
Результат:
<owner name="thename"> <datasets ndatasets="10" size="10000"> </datasets> </owner>
- Как удалить строку из текстового файла, используя номер строки в python
- Python: Элегантный способ определения ближайшего соответствия чисел в словаре
- Как открыть и прочитать файл LZMA в памяти
- Размер несжатого файла Python bz2
- Сжатый текст для хранения в базе данных mysql, должен ли он быть base64
- Как перечислить содержимое файла gzip без его извлечения в python?
- Как удалить пунктуацию из элемента в списке и сохранить его как отдельный элемент в списке?
- Как определить, сжат ли файл gzip?
- Выходной файл Django Compressor Blank Css
- Сжатие DXT для Python
- Как можно копировать внутреннее состояние объекта компрессора zlib в Python