0

特定の属性がない場合、XMLドキュメントを解析するときにすべてのタグを削除するにはどうすればよいですか?たとえば、すべてのタグ(もちろんrootを除く)にname属性を持たせたいと思います。私はXMLを使用してツリーデータベースを作成していますが、名前のないタグを使用しても意味がありません。

もちろん、すべてのタグを(深く)繰り返して、属性が存在するかどうかを確認することもできますが、ファイルが大きい場合は時間がかかります。

XMLParserでそれを行うためのいくつかのオプションがあるはずだと思います...多分いくつかのスキーマを使用していますか?

4

2 に答える 2

0

XPathとlxmlを使用すると、これは機能するはずです。

from lxml import etree

xml = etree.XML("<root><a name='1'><b name='1-1'>ABC</b></a><a>Does not exist</a><a name='2'>DEF</a><a><b name='3-1'>GHI</b></a></root>")

print 'Before:'
print etree.tostring(xml)

xp = etree.XPath("/*/*[not(@name)]") # or "//*[not(@name)]" to include the root tag
all_nodes = xp(xml)
for x in all_nodes:
    parent = x.getparent()
    #if parent is None: continue # if the root tag is included, the parent is None
    parent.remove(x)

print 'After:'
print etree.tostring(xml)
于 2012-05-25T12:14:55.513 に答える
0

XSLTでは非常に簡単です。2つのテンプレートルール、すべてをコピーするIDルール:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

不要な要素を破棄する別のルール:

<xsl:template match="*[not(@specific-attribute)]"/>
于 2012-05-25T11:27:43.133 に答える