3

我是尝试使用 python 解析 XML 的新手,我在下面提供了 xml。我需要获取以下数据 Instrmt afg="AG" 和 Qty Typ="FIN" QTYL="149" 我需要 AG 和 149。

我尝试了以下方法:

from xml.dom import minidom

xmldoc = minidom.parse(test.xml)

batch = xmldoc.getElementsByTagName('Batch')[0]

rpt = batch.getElementsByTagName('PosRpt')

for ag in rpt:
    sym = ag.getElementsByTagName('Instrmt')
    print(sym)

当我这样做时,我得到一个 DOM 对象,但不确定如何获得我想要的结果。

- <XML r="20030517" s="20042209" v="4.4" xr="FIA" xv="1">
- <Batch>
- <PosRpt RptID="175" BizDt="2013-01-03" ReqTyp="0" >
  <Pty ID="Ade" R="21" /> 
- <Pty ID="000" R="4">
  <Sub ID="F" Typ="29" /> 
  </Pty>
  <Instrmt afg="AG" ID="AG" Src="8" CFI="FFI" MMY="2013" Matf="2013"/> 
  <Qty Typ="AOD" QTYL="134" QTYS="0" /> 
  <Qty Typ="FIN" QTYL="149" QTYS="0" /> 
  <Amt Typ="FMTM" Amt="155065.44" /> 
  </PosRpt>
  </Batch>
  </XML>
4

2 回答 2

1

要提取属性的值,请使用elt.getAttribute("attribute_name"),例如:

print(sym.getAttribute("afg"), sym.getAttribute("ID"))

在您的情况下sym,仍然是节点列表,而不是节点(标签),因此您可以像这样访问列表的特定元素,例如:

sym = ag.getElementsByTagName('Instrmt')
for e in sym:
    print e.getAttribute("afg")

要不就:

print sym[0].getAttribute("afg")

如果您知道列表中只有一个元素。

您可以使用以下表达式检查您的标签是什么:

e.tagName == 'Instrmt'
于 2013-05-07T15:18:25.627 回答
0

看看ElementTreeXPATH规范:

from xml.etree import ElementTree as et

data = '''\
<XML r="20030517" s="20042209" v="4.4" xr="FIA" xv="1">
- <Batch>
- <PosRpt RptID="175" BizDt="2013-01-03" ReqTyp="0" >
  <Pty ID="Ade" R="21" /> 
- <Pty ID="000" R="4">
  <Sub ID="F" Typ="29" /> 
  </Pty>
  <Instrmt afg="AG" ID="AG" Src="8" CFI="FFI" MMY="2013" Matf="2013"/> 
  <Qty Typ="AOD" QTYL="134" QTYS="0" /> 
  <Qty Typ="FIN" QTYL="149" QTYS="0" /> 
  <Amt Typ="FMTM" Amt="155065.44" /> 
  </PosRpt>
  </Batch>
  </XML>
'''

#tree = et.parse('test.xml')
tree = et.fromstring(data)

# Find the first Instrmt node anywhere in the tree
print(tree.find('.//Instrmt').attrib['afg'])

# Find a Qty node with a particular attribute.
print(tree.find(".//Qty[@Typ='FIN']").attrib['QTYL'])

输出:

AG
149
于 2013-05-07T15:38:28.767 回答