2016-09-07 3 views
0

:LXML 비 재귀 전체 태그

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

나는 태그 이름과 첫 번째 노드에 대한 모든 속성, 즉, 그대로 코드 추출 싶습니다없이

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

을 서브 노드.

파이썬에서 예를 들어

, 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'"