Force属性存在于XML中的标记中

时间:2012-05-25 07:30:54

标签: python xml lxml

如果解析XML文档没有特定属性,如何删除所有标记?例如,我希望所有标签(当然除了root)都具有name属性。我使用XML来拥有树数据库,并且没有名称的标签根本就没有意义。

当然我可以迭代所有标签(深入)并检查属性是否存在但是需要一些时间来处理更大的文件。

我想应该有一些选项可以使用XMLParser ...也许使用一些架构?

2 个答案:

答案 0 :(得分:0)

XSLT非常简单。两个模板规则,一个复制所有内容的身份规则:

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

以及丢弃您不想要的元素的另一条规则:

<xsl:template match="*[not(@specific-attribute)]"/>

答案 1 :(得分: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)