2017-01-22 3 views
0

파이썬의 xml.etree 모듈을 사용할 때 어떻게 태그 안에 '>'와 '<'과 같은 xml-special 문자를 이스케이프 처리 할 수 ​​있습니까? 수동으로해야합니까? etree는 내가 누락 된 방법이나 kwarg가 있습니까? 내가 좋아하는 부분을보고 싶습니다Python xml.etree escaping

In [1]: from xml.etree.ElementTree import Element, SubElement, tostring 

In [2]: root = Element('filter') 

In [3]: root.set('type', 'test') 

In [4]: for op in ['<', '>', '=']: 
    ...:  sub_elem = SubElement(root, op) 
    ...:  child = Element('a') 
    ...:  child.text = 'b' 
    ...:  sub_elem.append(child) 
    ...: 

In [5]: tostring(root) 
Out[5]: '<filter type="test"><<><a>b</a></<><>><a>b</a></>><=><a>b</a></=></filter>' 

가 :

<&lt><a>b</a></&lt> 
+0

왜 '['< ','> ','= '] :'에 op를 사용하지 않으시겠습니까? – furas

+0

'<<>b'매우 이상한 마크 업입니다. 너 정말 그걸 원해? 올바른 형식의 XML은 아닙니다. – mzjn

답변

1

Where I would like to see sections like:

<&lt><a>b</a></&lt>

올바른 형식의 XML이 아닙니다. 나는 당신이 세미콜론을 잊어 버린 것 같지만 그들을 추가하는 것은 도움이되지 않는다. 다음은 잘못 형성된다 : 코드에서

<&lt;><a>b</a></&lt;> 

, 당신은, >=<라는 요소를 만들기 위해 노력하고 있습니다. 그것은 작동하지 않습니다. 다음 요소는 모두 XML 요소 이름에서 금지됩니다 ( <, >, =, &gt;, &lt;).

불행하게도, ElementTree는 약간 느슨하고 (문제에서) 이와 같은, 당신은 의사 XML을 생성 할 수 있습니다 :

<filter type="test"><<><a>b</a></<><>><a>b</a></>><=><a>b</a></=></f‌​ilter> 

당신이 lxml.etree을 사용했다면 대신 xml.etree.ElementTree의 (http://lxml.de 참조), 당신은 "ValueError : 잘못된 태그 이름 u '<'"과 같은 오류 메시지가 표시됩니다.

1

<>는 XML에 not valid characters하고, 대신 각각 &lt;&gt;로 대체해야

고려.

당신은 유효하지 않은 문자를 대체하는 정규 표현식을 사용할 수 있습니다

import re 

regexp = re.compile(r'<|>') # here we are making a regex to catch either the character '<' or '>' 
replacement_map = {'<': '&lt;', '>': '&gt;'} # a dict to map a character to the replacement value. 
regexp.sub(lambda match: replacement_map[match.group(0)], '<a>hello</a>') # do the replacement 

# output: '&lt;a&gt;hello&lt;/a&gt;' 

코드 ㄱ 좀 더 involoved 있지만, 그것은 교체를하는 매우 효율적인 방법입니다.

+0

이것은 대체 할 수있는 좋은 방법입니다. 내 질문은 수작업으로 교체가 필요한지 여부에 더 많은 변화가있었습니다. 나는 왜 etree가 나를 위해 도망 가지 않았는지, 적어도 탈출을 허용 할 수있는 분명한 옵션을 드러내는 지 혼란스러워했다. – djh