2012-05-25 2 views
0

Как удалить все теги при анализе XML-документа, если у них нет определенного атрибута? Например, я хочу, чтобы все теги (за исключением, конечно, root) имели атрибут имени. Я использую XML, чтобы иметь базу данных дерева и иметь теги без имени, просто не имеет смысла.Атрибут Force существует в тегах в XML

Конечно, я просто мог перебирать все теги (глубоко) и проверять, существует ли атрибут, но это займет некоторое время с большими файлами.

Я предполагаю, что должна быть какая-то возможность сделать это с помощью XMLParser ... возможно, используя какую-то схему?

+1

[XSLT] (http://en.wikipedia.org/wiki/XSLT), возможно, может сделать это очень легко. – Chris

ответ

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) 
+0

Это работает как шарм! Теперь я просто использую это сразу после разбора. – middleofdreams

+0

Рад, что это помогает! Убедитесь, что вы читаете больше о XPath для более сложных проблем. – jadkik94

0

Очень прост в XSLT. Два правила шаблона, правила идентичности, которая копирует все:

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

и другое правило, которое отбрасывает элементы, которые вы не хотите:

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

Можете ли вы показать, как использовать те, у которых есть lxml? Также я не совсем понимаю, почему мне нужны оба правила, почему сбросить правило недостаточно? – middleofdreams

+0

Я не знаю о XSLT, но [этот учебник по lxml] (http://lxml.de/xpathxslt.html#xslt) может вам помочь. :) – jadkik94

+0

Я ничего не знаю о lxml, но это решение полностью родовое и имеет минимальную зависимость от фактического словаря. Причина, по которой требуется первое правило, заключается в том, что встроенное правило шаблона по умолчанию в XSLT не делает того, что вы хотите в этом случае использования. –

Смежные вопросы