如果解析XML文档没有特定属性,如何删除所有标记?例如,我希望所有标签(当然除了root)都具有name属性。我使用XML来拥有树数据库,并且没有名称的标签根本就没有意义。
当然我可以迭代所有标签(深入)并检查属性是否存在但是需要一些时间来处理更大的文件。
我想应该有一些选项可以使用XMLParser ...也许使用一些架构?
答案 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)