2009-05-14 3 views
6

나는이 예제와 유사 LXML를 사용하여 네임 스페이스를 지정하기 위해 노력하고있어에서 네임 스페이스를 추가 (here에서 가져온) :파이썬 : lxml이

<TreeInventory xsi:noNamespaceSchemaLocation="Trees.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
</TreeInventory> 

I가 스키마 인스턴스를 추가하는 방법을 잘 모르겠어요 또한 스키마 위치를 사용하십시오. 인스턴스하지만 내가 지정하는 방법을 잘 모르겠어요

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance' 
>>> TREE = '{%s}' % NS 
>>> NSMAP = {None: NS} 
>>> tree = etree.Element(TREE + 'TreeInventory', nsmap=NSMAP) 
>>> etree.tostring(tree, pretty_print=True) 
'<TreeInventory xmlns="http://www.w3.org/2001/XMLSchema-instance"/>\n' 

하고도 위치를 지정 documentation 나처럼 뭔가를 수행하여 시작되었다. etree.Elementnsmap keyword-arg를 사용하여이 작업을 수행 할 수있는 것처럼 보이지만 어떻게 표시되지 않습니까? 명확성을 위해 좀 더 단계에서

답변

8

:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance' 

는 최대한 멀리 볼 수있는, 당신이 아닌 TreeInventory 요소를 네임 스페이스 원하는 속성 noNameSpaceSchemaLocation입니다. 그래서 :에 관해서는

>>> elem = etree.Element('TreeInventory') 
>>> elem.set(location_attribute, 'Trees.xsd') 

:

>>> location_attribute = '{%s}noNameSpaceSchemaLocation' % NS 
>>> elem = etree.Element('TreeInventory', attrib={location_attribute: 'Trees.xsd'}) 
>>> etree.tostring(elem, pretty_print=True) 
'<TreeInventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Trees.xsd"/>\n' 

이 당신은 속성없이, 또한 첫번째 요소를 만드는 과정의 수, 다음과 같이 속성을 설정 ... 당신이 원하는 무엇처럼 보인다 nsmap 매개 변수 : 필자는 직렬화에 사용할 접두사를 정의하는 데에만 사용됩니다. 이 경우, lxml은 문제의 네임 스페이스에 일반적으로 사용되는 접두사가 "xsi"임을 알고 있기 때문에 필요하지 않습니다. 잘 알려진 네임 스페이스가 아닌 경우 선호하는 접두사를 지정하지 않은 경우 "ns0", "ns1"등과 같은 접두어를 볼 수 있습니다. (기억해 두십시오 : 접두어가 중요하지 않다고 기억하십시오)

+0

작은 수정 : noNameSpaceSchemaLocation, noNameSpaceSchemaLocation이어야합니다. –