Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将XML解析为哈希表_Python_Xml_Dom - Fatal编程技术网

Python 将XML解析为哈希表

Python 将XML解析为哈希表,python,xml,dom,Python,Xml,Dom,我有一个XML文件,格式如下: <doc> <id name="X"> <type name="A"> <min val="100" id="80"/> <max val="200" id="90"/> </type> <type name="B"> <min val="100" id="20"/> <max val="20" id="90"/>

我有一个XML文件,格式如下:

<doc>
<id name="X">
  <type name="A">
    <min val="100" id="80"/>
    <max val="200" id="90"/>
   </type>
  <type name="B">
    <min val="100" id="20"/>
    <max val="20" id="90"/>
  </type>
</id>

<type...>
</type>
</doc>

在Python中如何实现这一点?

我建议使用该库

这些文档非常好,所以你应该马上就可以开始运行了


丹。

为什么不试试图书馆之类的东西呢。他们有很多文档和教程。

另一个XML解析库:

  • 解析XML文档从这里开始:
正如其他人所说的,这是一条通往这里的道路。打开(并解析)文件,同时检查节点是否相关,是否应该读取。这样,您还可以知道是否要读取子节点

把这个放在一起,似乎可以做你想做的。某些值是通过属性位置而不是属性名称读取的。并且没有错误处理。最后的print()表示其Python 3.x

我将把它作为一个练习来改进它,只是想发布一个片段让您开始

快乐黑客!:)

xml.txt

<doc>
<id name="X">
  <type name="A">
    <min val="100" id="80"/>
    <max val="200" id="90"/>
   </type>
  <type name="B">
    <min val="100" id="20"/>
    <max val="20" id="90"/>
  </type>
</id>
</doc>
输出:

{'X': {'A': [('100', '80'), ('200', '90')], 'B': [('100', '20'), ('20', '90')]}}

我不同意其他答案中关于使用minidom的建议——这是对最初为其他语言设计的标准的一个非常普通的Python改编,可以使用,但不是很适合。现代Python中推荐的方法是

在第三方模块中也实现了相同的接口,速度更快,但除非您需要极高的速度,否则Python标准库中包含的版本很好(无论如何都比minidom快)——关键是编程到该接口,然后,如果愿意,您可以随时切换到同一接口的不同实现,只需对自己的代码进行最小的更改

例如,在完成所需的导入&c之后,以下代码是示例的最小实现(它不验证XML是否正确,只提取假设正确的数据——添加各种检查当然非常简单):


根据您的示例输入,这将产生您想要的结果。

不要重新发明轮子。使用Amara工具包。 无论如何,变量名只是字典中的键。

这种问题已经被问过好几次了。这些答案也许能帮助你解决问题。对不起,我住错房间了。fugly代码竞赛正在进行中。另一个链接-您将得到一个变量doc,该变量有doc.id,它有doc.id.type[0],然后是doc.id.type[0].min。。。等等超级容易访问!警告:挪威蓝鹦鹉综合症:上次发布于5年前。Python 2.5和2.6没有Windows安装程序。
对于节点中的子节点。getchildren():
是不必要的;对节点中的子节点使用
。警告:xml.etree.ElementTree模块不安全,无法防止恶意构造的数据。如果需要解析不受信任或未经验证的数据,请参阅XML漏洞。只是为了谨慎,我更熟悉BeautifulSoup和解析URL,而不是本地XML文件,所以这对我来说是一个很好的间隙解决方案。
from xml.dom import minidom
data={}
doc=minidom.parse("xml.txt")
for n in doc.childNodes[0].childNodes:
    if n.localName=="id":
        id_name = n.attributes.item(0).nodeValue
        data[id_name] = {}
        for j in n.childNodes:
            if j.localName=="type":
                type_name = j.attributes.item(0).nodeValue
                data[id_name][type_name] = [(),()]
                for k in j.childNodes:
                    if k.localName=="min":
                        data[id_name][type_name][0] = \
                            (k.attributes.item(1).nodeValue, \
                             k.attributes.item(0).nodeValue)
                    if k.localName=="max":
                        data[id_name][type_name][1] = \
                            (k.attributes.item(1).nodeValue, \
                             k.attributes.item(0).nodeValue)
print (data)
{'X': {'A': [('100', '80'), ('200', '90')], 'B': [('100', '20'), ('20', '90')]}}
from xml.etree import ElementTree as et  # or, import any other, faster version of ET

def xml2data(xmlfile):
  tree = et.parse(xmlfile)
  data = {}
  for anid in tree.getroot().getchildren():
    currdict = data[anid.get('name')] = {}
    for atype in anid.getchildren():
      currlist = currdict[atype.get('name')] = []
      for c in atype.getchildren():
        currlist.append((c.get('val'), c.get('id')))
  return data