добавление узлов в файл XML с тем же именем узла, но разными атрибутами с помощью Python Dom - PullRequest
1 голос
/ 22 марта 2011


возможно ли добавить два узла с одинаковым именем в XML-документ?
Это что-то вроде этого:
Исходный файл:

<Files>
  <Filter>
  </Filter>
</Files>

Требуемый файл:

<Files>
  <Filter>
    <File RelativePath=".\src\aaa.cxx" ></File>
    <File RelativePath=".\src\bbb.cxx"></File>
  </Filter>
</Files>

Я хотел бы сделать это с Python, dom или minidom.
Я попытался использовать функцию appendChild, но если оставить только один узелто же имя.
Я пытался использовать функцию insertBefore, но, похоже, она тоже не работает.

Вот исходный код, который я использовал с insertBefore (с appendChild, просто нужно удалить элемент управления nbOfFiles):

document = xml.dom.minidom.parse (fileTmp)
filesItem = Item.getElementsByTagName("Files")[0]
for filter in filesItem.getElementsByTagName("Filter") :
  filterAttribute      = filter.getAttribute("Filter")
  filePath = os.path.split (fileTmp)[0] + "/src"
  filesInPath = os.listdir (filePath)
  fileElement = document.createElement ("File")
  nbOfFiles = 0
  for file in filesInPath :
    fileElement.setAttribute ("RelativePath", file)
    if nbOfFiles == 0 :
      filter.appendChild (fileElement)
      lastFileElement = fileElement
      nbOfFiles = nbOfFiles + 1
    else :
      filter.insertBefore (fileElement, None)

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 22 марта 2011

Не уверен, где ваш код работает неправильно, так как вы не предоставили тестируемый пример.Я не особенно знаком с minidom, я предпочитаю lxml.

Я подозреваю, что вам нужно создавать экземпляры каждого нового дочернего узла отдельно.

Это работает для меня:

>>> import xml.dom.minidom
>>>
>>> data_in = """<Files>
...   <Filter>
...   </Filter>
... </Files>
... """
>>>
>>> data_add = ('./src/aaa.cxx','./src/bbb.cxx')
>>>
>>> doc = xml.dom.minidom.parseString(data_in)
>>> files= doc.getElementsByTagName("Files")[0]
>>> for filter in files.getElementsByTagName("Filter"):
...   for item in data_add:
...     newNode = doc.createElement("File")
...     newNode.setAttribute('RelativePath',item)
...     filter.appendChild(newNode)
...
<DOM Element: File at 0x984c66c>
<DOM Element: File at 0x984c80c>
>>> print doc.toxml()
<?xml version="1.0" ?>
<Files>
  <Filter>
  <File RelativePath="./src/aaa.cxx"/><File RelativePath="./src/bbb.cxx"/></Filter>
</Files>
...