Редактирование XML как словарь в Python?

svg.js нуждается в dom некоторой формы для создания элементов svg. Вам не обязательно нужен HTML-дом. Для использования сервера вы можете взглянуть на svgdom: https://github.com/svgdotjs/svgdom

svgdom - это нестандартный dom, что означает, что у него достаточно для запуска svg.js, но не более и не соответствуют стандарту в любом случае. Тем не менее, это достаточно близко к «истине», что вы можете использовать его для многих вещей. Это позволяет svg.js работать на узле. Даже такие вещи, как getBBox и getBoundingClientRect работают.

8
задан nealmcb 21 March 2012 в 19:05
поделиться

5 ответов

Для легкого управления XML в Python мне нравится библиотека Beautiful Soup. Это работает что-то вроде этого:

Демонстрационный XML-файл:

<root>
  <level1>leaf1</level1>
  <level2>leaf2</level2>
</root>

Код Python:

from BeautifulSoup import BeautifulStoneSoup, Tag, NavigableString

soup = BeautifulStoneSoup('config-template.xml') # get the parser for the xml file
soup.contents[0].name
# u'root'

Можно использовать имена узла в качестве методов:

soup.root.contents[0].name
# u'level1'

Также возможно использовать regexes:

import re
tags_starting_with_level = soup.findAll(re.compile('^level'))
for tag in tags_starting_with_level: print tag.name
# level1
# level2

Добавление и вставка новых узлов довольно просты:

# build and insert a new level with a new leaf
level3 = Tag(soup, 'level3')
level3.insert(0, NavigableString('leaf3')
soup.root.insert(2, level3)

print soup.prettify()
# <root>
#  <level1>
#   leaf1
#  </level1>
#  <level2>
#   leaf2
#  </level2>
#  <level3>
#   leaf3
#  </level3>
# </root>
8
ответ дан 5 December 2019 в 04:43
поделиться

Я не уверен, если преобразование инфонабора к вложенному dicts сначала легче. Используя ElementTree, можно сделать это:

import xml.etree.ElementTree as ET
doc = ET.parse("template.xml")
lvl1 = doc.findall("level1-name")[0]
lvl1.remove(lvl1.find("leaf1")
lvl1.remove(lvl1.find("leaf2")
# or use del lvl1[idx]
doc.write("config-new.xml")

ElementTree был разработан так, чтобы Вы не преобразовывали свои деревья XML в списки, и приписывает сначала, так как он использует точно это внутренне.

Это также поддерживает как небольшое подмножество XPath.

11
ответ дан 5 December 2019 в 04:43
поделиться

Вы попробовали это?

print xml.etree.ElementTree.tostring( conf_new )
0
ответ дан 5 December 2019 в 04:43
поделиться

Это даст вам dict минус атрибуты... не знаю, полезно ли это кому-нибудь. Я сам искал решение для преобразования xml в dict, когда пришел к этому.



import xml.etree.ElementTree as etree

tree = etree.parse('test.xml')
root = tree.getroot()

def xml_to_dict(el):
  d={}
  if el.text:
    d[el.tag] = el.text
  else:
    d[el.tag] = {}
  children = el.getchildren()
  if children:
    d[el.tag] = map(xml_to_dict, children)
  return d

Это: http://www.w3schools.com/XML/note.xml

<note>
 <to>Tove</to>
 <from>Jani</from>
 <heading>Reminder</heading>
 <body>Don't forget me this weekend!</body>
</note>

Будет равно этому:


{'note': [{'to': 'Tove'},
          {'from': 'Jani'},
          {'heading': 'Reminder'},
          {'body': "Don't forget me this weekend!"}]}
19
ответ дан 5 December 2019 в 04:43
поделиться

самый прямой путь ко мне:

root        = ET.parse(xh)
data        = root.getroot()
xdic        = {}
if data > None:
    for part in data.getchildren():
        xdic[part.tag] = part.text
0
ответ дан 5 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: