Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 - Fatal编程技术网

python-未从XML中提取值

python-未从XML中提取值,python,xml,Python,Xml,我有一个结构如下的XML文件: <root> <subroot id="someID"> <val1 value="a"/> <val2 value="b"/> <val3 value="c"/> <val4 value="1"/> <val5 value="2"/> <val6 value="3"/> <otherval value=

我有一个结构如下的XML文件:

<root>
  <subroot id="someID">
    <val1 value="a"/>
    <val2 value="b"/>
    <val3 value="c"/>
    <val4 value="1"/>
    <val5 value="2"/>
    <val6 value="3"/>
    <otherval value="xyz"/>
  </subroot>
  <subroot id="anotherID">
    <val1 value="aa"/>
    <val2 value="bb"/>
    <val3 value="cc"/>
    <val4 value="11"/>
    <val5 value="22"/>
    <val6 value="33"/>
    <otherval value="xxyyzz"/>
  </subroot>
  .
  .
  .
  .
</root>
这是我的非工作代码,它生成空格,即
val1=“”,val2=“”…

def getValues(self):
    from xml.dom.minidom import parseString
    import json

    file = open('myfile.xml','r')
    data = file.read()
    dom = parseString(data)
    rows = dom.getElementsByTagName("root")[0].getElementsByTagName("subroot")
    valueString = ""
    for row in rows:
        valueString = valueString+json.dumps(
        {
        'val1': row.getAttribute("val1"),
        'val2': row.getAttribute("val2"),
        'val3': row.getAttribute("val3"),
        'val4': row.getAttribute("val4"),
        'val5': row.getAttribute("val5"),
        'val6': row.getAttribute("val6"),
        'other': row.getAttribute("otherval")},
        sort_keys=True,
        indent=4)+","
    response_generator = ( "["+valueString[:-1]+"]" )
    return HttpResponse(response_generator)
    otherval=xyz
我知道这实际上会生成JSON,但这并不重要。重要的是能够提取这些值,然后我可以在以后对它们做任何事情

有人能告诉我我错过了什么吗? 另外,我是否应该更改XML,使所有的
val1、val2、val3….
都被称为
val


谢谢。

我的建议是将您的数据结构如下:


A.
B
C
D
2.
3.
xyz
aa
bb
复写的副本
11
22
33
xxyyzz
然后,为了解析,我建议使用etree库——它位于Python的标准库中,我发现使用它比使用其他任何东西都要好得多。这只是一个简单的迭代子轨迹和值元素并提取数据的例子

从xml.etree导入元素树
xml=ElementTree.parse(“test.xml”)
root=xml.getroot()
全部={}
对于root.findall(“subroot”)中的组:
温度={}
对于group.findall中的值(“值”):
temp[value.get(“id”)]=value.text
所有[group.get(“id”)]=temp
所有这些都将是:

{'someID':{'1':'a','3':'c','2':'b','5':'2','4':'d','6':'3','other':'xyz'},'anotherID':{'1':'aa','3':'cc','2':'bb','5':'22','4':'11','6':'33','other':'xxyzz}
您还可以通过以下方式执行此操作:

all={group.get(“id”):{value.get(“id”):value.text代表group.findall(“value”)}中的值代表root.findall(“subroot”)中的组

请注意,这有点难读,如果您尝试执行更复杂的操作,它将崩溃。

我的建议是按如下方式构建数据:

>>> rows = dom.getElementsByTagName("root")[0].getElementsByTagName("subroot")

>>> v = rows[0].getElementsByTagName("val1")[0]

>>> v.getAttribute("value")
u'a'

A.
B
C
D
2.
3.
xyz
aa
bb
复写的副本
11
22
33
xxyyzz
然后,为了解析,我建议使用etree库——它位于Python的标准库中,我发现使用它比使用其他任何东西都要好得多。这只是一个简单的迭代子轨迹和值元素并提取数据的例子

从xml.etree导入元素树
xml=ElementTree.parse(“test.xml”)
root=xml.getroot()
全部={}
对于root.findall(“subroot”)中的组:
温度={}
对于group.findall中的值(“值”):
temp[value.get(“id”)]=value.text
所有[group.get(“id”)]=temp
所有这些都将是:

{'someID':{'1':'a','3':'c','2':'b','5':'2','4':'d','6':'3','other':'xyz'},'anotherID':{'1':'aa','3':'cc','2':'bb','5':'22','4':'11','6':'33','other':'xxyzz}
您还可以通过以下方式执行此操作:

all={group.get(“id”):{value.get(“id”):value.text代表group.findall(“value”)}中的值代表root.findall(“subroot”)中的组
请注意,这是一个有点难读,并会崩溃,如果你试图做任何更复杂的事情

>>> rows = dom.getElementsByTagName("root")[0].getElementsByTagName("subroot")

>>> v = rows[0].getElementsByTagName("val1")[0]

>>> v.getAttribute("value")
u'a'
我建议你使用ElementTree更容易理解

>>> import xml.etree.ElementTree as et
>>> root = et.fromstring(data)
>>> v = root.find("*/val1")
>>> v.get("value")
'a'
我建议你使用ElementTree更容易理解

>>> import xml.etree.ElementTree as et
>>> root = et.fromstring(data)
>>> v = root.find("*/val1")
>>> v.get("value")
'a'

val1
etc不是
subroot
行的属性。它们是子行,每个子行都有一个包含所需数据的
value
属性。您需要获取每个
子脚本的子脚本
,并对它们进行迭代,在每个子脚本上调用
row.getAttribute(“value”)


正如Lattyware所说,是的,您应该重命名元素。

val1
等不是
subroot
行的属性。它们是子行,每个子行都有一个包含所需数据的
value
属性。您需要获取每个
子脚本的子脚本
,并对它们进行迭代,在每个子脚本上调用
row.getAttribute(“value”)


正如Lattyware所说,是的,您应该重命名您的元素。

在最后回答您的问题时,是的。在任何XML中,标记名定义了您要处理的内容—在本例中是一个值,然后属性或标记值为您提供标记所包含的数据。在任何XML中,标记名定义了您要处理的内容—在本例中是一个值,然后属性或标记值为您提供标记所包含的数据。感谢您的设计建议。我已经修改了我的代码来生成这个设计,并准备好了XML文档。我不确定你的代码是否有效。也许我做错了什么。@eoinzy我在Python2和Python3下都运行过它,在这两种情况下都运行得很好。嗯,这很奇怪。当我输出
all
时,我只得到
someIDanotherID
@eoinzy我猜您的值元素有问题,您是否更改了XML以匹配我的值元素?包括标记值不是val?(或者显然是与您的XML匹配的代码)。我添加的唯一内容是
返回HttpResponse(all)
,因为我使用的是
Django
,所以我需要输出到网页。感谢您的设计建议。我已经修改了我的代码来生成这个设计,并准备好了XML文档。我不确定你的代码是否有效。也许我做错了什么。@eoinzy我在Python2和Python3下都运行过它,在这两种情况下都运行得很好。嗯,这很奇怪。当我输出
all
时,我只得到
someIDanotherID
@eoinzy我猜您的值元素有问题,您是否更改了XML以匹配我的值元素?包括标记值不是val?(或者显然是与您的XML匹配的代码)。我添加的唯一内容是
返回HttpResponse(all)
,因为我使用的是
Django
,所以我需要输出到网页。