3

私は毎日1つの大きな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を使用していますが、他の簡単でポータブルなソリューションも歓迎します

4

3 に答える 3

4

XSLT1.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の旅を始めるためのヒントをいくつか紹介します。

于 2012-06-19T07:29:46.227 に答える
4

XSLTソリューションdataset(Seanのソリューションは優れていますが、子にされた他の要素またはノードがあると機能しなくなります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>

説明

IDルールを適切に使用し、の任意の子ノードに一致する空のボディテンプレートでオーバーライドしますdatasets

于 2012-06-19T12:24:03.640 に答える
2

@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>
于 2012-06-19T07:38:15.787 に答える