2009-05-14 9 views
6

Próbuję określić nazw używając lxml podobny do tego przykładu (podjęte od here):Python: dodawanie nazw w lxml

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

nie jestem pewien jak dodać instancję do schematu użyj, a także lokalizację schematu. documentation zacząłeś mnie, robiąc coś takiego:

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

Nie jestem pewien, jak to określił wystąpienie choć i wtedy też określić lokalizację. Wygląda na to, że można to zrobić za pomocą słowa kluczowego-arg nsmap w argumencie etree.Element, ale nie widzę sposobu.

Odpowiedz

8

W niektórych kilku etapach, dla jasności:

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

O ile widzę, to atrybut noNameSpaceSchemaLocation które chcą przestrzeni nazw, a nie element TreeInventory. Więc:

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

To wygląda co chciałeś ... Można by oczywiście również utworzyć pierwszy element, bez atrybutów, a następnie ustawić atrybut, na przykład:

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

chodzi o Parametr nsmap: Sądzę, że jest używany tylko do zdefiniowania prefiksów używanych w serializacji. W tym przypadku nie jest to konieczne, ponieważ lxml wie, że często używanym prefiksem dla danej przestrzeni nazw jest "xsi". Jeśli nie byłaby to dobrze znana przestrzeń nazw, prawdopodobnie zobaczysz przedrostki takie jak "ns0", "ns1" itd., Chyba że określiłeś preferowany prefiks. (pamiętaj: przedrostek nie ma znaczenia)

+0

Tylko drobna korekta: Powinna być noNamePaceSchemaLocation, no noNameSpaceSchemaLocation. –

Powiązane problemy