2016-09-07 2 views
0

lxmlの非再帰的なフルタグ

<node a='1' b='1'> 
    <subnode x='25'/> 
</node> 

私はタグ名と最初のノードのすべての属性、すなわち、逐語的にコードを抽出したいと思います:なし

<node a='1' b='1'> 

をサブノード

Pythonで例えば

、あまりtostring戻り値:

from lxml import etree 
root = etree.fromstring("<node a='1' b='1'><subnode x='25'>some text</subnode></node>") 
print(etree.tostring(root)) 

戻り

b'<node a="1" b="1"><subnode x="25">some text</subnode></node>' 

以下は、所望の結果を与えるが、あまりにも冗長である:

tag = root.tag 
for att, val in root.attrib.items(): 
    tag += ' '+att+'="'+val+'"' 
tag = '<'+tag+'>' 
print(tag) 

結果:

<node a="1" b="1"> 

これを行う方が簡単な(そして保証された属性の順序を保つ)方法は何ですか?

+0

*「保証された属性の順序を保持する」*は巨大なコードの匂いです。 ''文字列で何をしようとしていますか? – Tomalak

+0

@Tomalak私は、実際のサブツリーの移動やノード除去の簿記の問題を踏まずに、いくつかの上位レベルノードといくつかの下位レベルノード(中間レベルノードをスキップ)から新しいツリーを構築したいと考えています。 – Marijn

+0

ツリー変換が目的ならば、XSLTを見ることをお勧めします。これはタスクに最も適したツールです.XSLTソリューションは、通常、同等のDOM APIコードよりもはるかにエレガントです。合理的に完成した入力文書とそれに必要な出力を投稿します。つまり、XMLでは属性の順序は重要ではありません。属性の順序に依存するシステムを作成しないでください。 – Tomalak

答えて

1

すべてのサブノードを削除できます。

from lxml import etree 

root = etree.fromstring("<node a='1' b='1'><subnode x='25'>some text</subnode></node>") 
for subnode in root.xpath("//subnode"): 
    subnode.getparent().remove(subnode) 

etree.tostring(root) # '<node a="1" b="1"/>' 

また、単純な正規表現を使用することもできます。注文は保証されています。

import re 
res = re.search('<(.*?)>', etree.tostring(root)) 
res.group(1) # "node a='1' b='1'"