python-未从XML中提取值
我有一个结构如下的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=
<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
,所以我需要输出到网页。