Похудение на 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, но также приветствуются и другие простые и портативные решения.

Решение 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>