Вставка узлов XML в существующий документ XML с Python

I am trying to insert xml nodes in this document:

</providers>

</root>

Я написал этот код:     импортировать xml.dom.minidom как m

doc = m.parse("monfichier.xml")
valeurs = doc.getElementsByTagName("providers")
element = doc.createElement("provider")
valeurs.appendChild(element)

elthost = doc.createElement("hostnamep") 
eltLTVC = doc.createElement("LocalTrustValueC")
element.appendchild(elthost)
element.appendchild(eltLTVC)

texteHost = doc.createTextNode("machinename")
texteLTVC = doc.createTextNode("23") 
eltHost.appendChild(texteHost)
eltLTVC.appendChild(texteLTVC)
doc.writexml(open("monfichier.xml","w"))

And I want to obtain at the end this xml document : machinename 23

    </provider> 
</providers>

</root>

Но я получил эту ошибку:     valeurs.appendChild (элемент)     AttributeError: «NodeList» объект не имеет атрибута "appendChild"

 ness kh17 июн. 2012 г., 21:57
Спасибо за совет. Так что же будет решением XSLT?
 ness kh17 июн. 2012 г., 21:23
Спасибо, но меня интересует XML с использованием xml.dom.minidom. Любая помощь приветствуется.
 Dimitre Novatchev17 июн. 2012 г., 22:23
Я только что опубликовал полное решение XSLT. Обратите внимание, что первый шаблон является стандартным, и никому не нужно придумывать его - он даже добавляется по умолчанию некоторыми XSLT IDE. Таким образом, вы просто сопоставляете элемент, к которому хотите добавить дочерние элементы, и указываете эти дочерние элементы буквально в строке.
 Dimitre Novatchev17 июн. 2012 г., 21:42
Имейте в виду, что не использовать XSLT для каких-либо преобразований XML - пустая трата времени.
 Dimitre Novatchev17 июн. 2012 г., 21:11
Такие операции намного проще выразить с помощью XSLT. Заинтересованы ли вы в решении XSLT?

Ответы на вопрос(2)

Решение Вопроса

http://docs.python.org/library/xml.dom.html#dom-node-objects кажется, что NodeList не имеет метода appendChild. Вместо этого вы хотите получить первый узел в наборе результатов (поскольку ваше сообщение подразумевает, что он есть только один) и вызвать appendChild на этом узле.

valeurs = doc.getElementsByTagName("providers").item(0)
element = doc.createElement("provider")
valeurs.appendChild(element)
 17 июн. 2012 г., 23:22
Не могу вспомнить, чувствителен ли регистр Python к регистру? Ваш комментарий относится к «appendchild» без строчных букв "с"; in 'child'. Вы пробовали код с большой буквы C?
 ness kh17 июн. 2012 г., 22:28
После проверки вашего предложения я получаю еще одну ошибку, связанную с & quot; element & quot ;: element.appendchild (elthost). AttributeError: Экземпляр элемента не имеет атрибута "app; appendchild".
 ness kh17 июн. 2012 г., 23:34
Действительно большое спасибо, Флинн. Это была просто моя ошибка. Неосторожная ошибка!

Here is a complete and short XSLT solution:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="providers">
  <providers>
        <provider>
            <hostnamep>machinename</hostnamep>
            <LocalTrustValueC>23</LocalTrustValueC>
        </provider>
  </providers>
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on the provided XML document:

<root>
    <providers> 
    </providers>
</root>

the wanted, correct result is produced:

<root>
   <providers>
      <provider>
         <hostnamep>machinename</hostnamep>
         <LocalTrustValueC>23</LocalTrustValueC>
      </provider>
   </providers>
</root>

Ваш ответ на вопрос