2016-07-08 1 views
1

Je veux produire ce fichier xml avec python et minidom:Ajout d'espaces de noms à un python élément DOM

<xml vesion="1.0" encoding="utf-8?> 
<package name="Operation" xmlns="http://www.modelIL.eu/types-2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.modelIL.eu/types-2.0 modelIL-package-2.0.xsd"> 
</package> 

J'écrivaient ceci:

import xml.dom.minidom as dom 

document = dom.Document() 
root_xml = document.createElement("package") 
root_xml.setAttribute("name", "Operation") 
root_xml.setAttributeNS("", "xmlns", "http://www.modelIL.eu/types-2.0") 
root_xml.setAttributeNS("xmls", "xsi", "http://www.w3.org/2001/XMLSchema-instance") 
root_xml.setAttribute("xsi:schemaLocation", "http://www.modelIL.eu/types-2.0 modelIL-package-2.0.xsd") 
root = document.appendChild(root_xml) 

print(document.toprettyxml(indent(" ")) 

Mais la sortie que je reçois est celui-ci:

<xml vesion="1.0" ?> 
<package name="Operation" xmlns="http://www.modelIL.eu/types-2.0" xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.modelIL.eu/types-2.0 modelIL-package-2.0.xsd"> 
</package> 

Pourquoi dois-je seulement xsi et non xmlns:xsi? Ai-je oublié quelque chose?

Répondre

1

Explication complète: Je n'utilise pas minidom pour XML, j'utilise lxml et en plus je n'utilise pas le XML aussi souvent, alors j'espère que ma réponse sera utile.

On pourrait attendre à ce que en définissant un attribut avec un espace de nom particulier, il n'y aurait pas besoin d'indiquer explicitement un préfixe à comparaître devant le nom local dans le document final XML écrit - après tout, il devrait il est possible de détecter qu'un espace de noms a été utilisé et qu'un préfixe est requis dans le nom d'attribut complet afin que l'attribut soit reconnu comme étant associé à cet espace de noms. Malheureusement, nous ne semble pas avoir ce luxe et préciser explicitement un préfixe dans le cadre du nom qualifié lors de la création d'un tel attribut

Python and XML: An Introduction (passez à la partie atributs)

Cela devrait résoudre votre problème :

root_xml.setAttributeNS("xmls", "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance") 

Comme vous le savez la méthode setAttributeNS prend trois arguments: namespaceURI, qualifiedName, valeur. L'attribut est ajouté si l'élément n'a pas d'attribut avec les mêmes namespaceURI et localname - nous obtenons le nom local en faisant une division sur qualifiedName en utilisant la fonction _nssplit. Sinon, la méthode essaie de mettre à jour la valeur de l'attribut.

Toutefois, le nom de l'attribut est une combinaison de préfixe (la partie du nom qualifié avant la ponctuation du signe deux-points) et le nom local "%s:%s" % (prefix, localName). Si aucun préfixe n'est présent, le nom de l'attribut est le même que l'argument qualifiedName.

Si vous ne tenez pas compte du namespaceURI de vos attributs, vous pouvez obtenir le même résultat en utilisant uniquement la méthode setAttribute comme vous l'avez fait pour le premier et le dernier attribut. Dans ce cas, la méthode recherchera un attribut avec le même nom d'attribut. S'il en trouve un, il essaiera d'écraser sa valeur.

J'ai une question: pourquoi lier root = document.appendChild(root_xml)? Est-ce pour éviter la valeur de retour dans votre REPL? C'est ce que je comprends.

+1

Merci beaucoup pour votre réponse. Je comprends mieux le setAttributesNS et cela m'a aidé à résoudre mon problème! Et pour votre question, je lie 'root = document.appendChild (root_xml)' parce que je l'ai trouvé plus compréhensible pour moi parce que je donne la racine à d'autres fonctions pour y ajouter des enfants. – user3314570

+0

Content d'entendre ça! Et merci pour votre réponse concernant 'root'. – dasdachs