Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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_Elementtree - Fatal编程技术网

用Python读取XML文件

用Python读取XML文件,python,xml,elementtree,Python,Xml,Elementtree,我在Python中使用ElementTree读取XML文件并获取一些值。问题是我成功地获得了变量名,但是我无法读取包含在表标记underdefinition标记中的值 下面是我的代码来读取这些名称: tree = parse("basicfirealarm.xml") root = tree.find('NETWORK') for node in root: var = node.find('NAME') # access the var definition p

我在Python中使用ElementTree读取XML文件并获取一些值。问题是我成功地获得了变量名,但是我无法读取包含在表标记underdefinition标记中的值

下面是我的代码来读取这些名称:

tree = parse("basicfirealarm.xml")
root = tree.find('NETWORK')

for node in root:
    var = node.find('NAME')        # access the var definition
    print var.text
这是我试图读取的文件,您能给我一些建议,如何使用ElementTree访问表标记中的值吗

多谢各位

<?xml version="1.0" encoding="US-ASCII"?>

<!-- DTD for the XMLBIF 0.3 format -->
<!DOCTYPE BIF [
<!ELEMENT BIF ( NETWORK )*>
   <!ATTLIST BIF VERSION CDATA #REQUIRED>
<!ELEMENT NETWORK ( NAME, ( PROPERTY | VARIABLE | DEFINITION )* )>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT VARIABLE ( NAME, ( OUTCOME |  PROPERTY )* ) >
<!ATTLIST VARIABLE TYPE (nature|decision|utility) "nature">
<!ELEMENT OUTCOME (#PCDATA)>
<!ELEMENT DEFINITION ( FOR | GIVEN | TABLE | PROPERTY )* >
<!ELEMENT FOR (#PCDATA)>
<!ELEMENT GIVEN (#PCDATA)>
<!ELEMENT TABLE (#PCDATA)>
<!ELEMENT PROPERTY (#PCDATA)>
]>

<BIF VERSION="0.3">
<NETWORK>

<VARIABLE TYPE="nature">
   <NAME>tampering</NAME>
   <OUTCOME>T</OUTCOME>
   <OUTCOME>F</OUTCOME>
   <PROPERTY>position = (-148.1863, -197.12207)</PROPERTY>
</VARIABLE>

<VARIABLE TYPE="nature">
   <NAME>fire</NAME>
   <OUTCOME>T</OUTCOME>
   <OUTCOME>F</OUTCOME>
   <PROPERTY>position = (67.29127, -200.31433)</PROPERTY>
</VARIABLE>

<VARIABLE TYPE="nature">
   <NAME>alarm</NAME>
   <OUTCOME>T</OUTCOME>
   <OUTCOME>F</OUTCOME>
   <PROPERTY>position = (-46.03397, -61.451008)</PROPERTY>
</VARIABLE>

<VARIABLE TYPE="nature">
   <NAME>smoke</NAME>
   <OUTCOME>T</OUTCOME>
   <OUTCOME>F</OUTCOME>
   <PROPERTY>position = (158.27069, -67.83553)</PROPERTY>
</VARIABLE>

<VARIABLE TYPE="nature">
   <NAME>leaving</NAME>
   <OUTCOME>T</OUTCOME>
   <OUTCOME>F</OUTCOME>
   <PROPERTY>position = (-44.437843, 74.22005)</PROPERTY>
</VARIABLE>

<VARIABLE TYPE="nature">
   <NAME>report</NAME>
   <OUTCOME>T</OUTCOME>
   <OUTCOME>F</OUTCOME>
   <PROPERTY>position = (-42.841713, 200.31433)</PROPERTY>
</VARIABLE>


<DEFINITION>
   <FOR>tampering</FOR>
   <TABLE> 0.02 0.98</TABLE>
</DEFINITION>

<DEFINITION>b
   <FOR>fire</FOR>
   <TABLE> 0.01 0.99</TABLE>
</DEFINITION>

<DEFINITION>
   <FOR>alarm</FOR>
   <GIVEN>tampering</GIVEN>
   <GIVEN>fire</GIVEN>
   <TABLE> 0.5 0.5 0.85 0.15 0.99 0.01 1.0E-4 0.9999</TABLE>
</DEFINITION>

<DEFINITION>
   <FOR>smoke</FOR>
   <GIVEN>fire</GIVEN>
   <TABLE> 0.9 0.1 0.01 0.99</TABLE>
</DEFINITION>

<DEFINITION>
   <FOR>leaving</FOR>
   <GIVEN>alarm</GIVEN>
   <TABLE> 0.88 0.12 0.0010 0.999</TABLE>
</DEFINITION>

<DEFINITION>
   <FOR>report</FOR>
   <GIVEN>leaving</GIVEN>
   <TABLE> 0.75 0.25 0.01 0.99</TABLE>
</DEFINITION>


</NETWORK>
</BIF>

]>
篡改
T
F
位置=(-148.1863,-197.12207)
火
T
F
位置=(67.29127,-200.31433)
警报
T
F
位置=(-46.03397,-61.451008)
烟
T
F
位置=(158.27069,-67.83553)
离开
T
F
位置=(-44.437843,74.22005)
报告
T
F
位置=(-42.841713200.31433)
篡改
0.02 0.98
B
火
0.01 0.99
警报
篡改
火
0.50.50.85 0.15 0.99 0.01 1.0E-40.9999
烟
火
0.9 0.1 0.01 0.99
离开
警报
0.88 0.12 0.0010 0.999
报告
离开
0.75 0.25 0.01 0.99

您需要将
findall()
'DEFINITION'
一起使用,然后在它下面使用
'TABLE'
标记:

>>> root = tree.find('NETWORK')
>>> 
>>> for node in root.findall('DEFINITION'):
...   print node.find('TABLE').text
... 
 0.02 0.98
 0.01 0.99
 0.5 0.5 0.85 0.15 0.99 0.01 1.0E-4 0.9999
 0.9 0.1 0.01 0.99
 0.88 0.12 0.0010 0.999
 0.75 0.25 0.01 0.99
如果需要变量名称和值:

>>> for node in root.findall('DEFINITION'):
...     for child in node:
...         if child.tag in ('FOR', 'TABLE'):
...             print child.tag, '=', child.text 
... 
FOR = tampering
TABLE =  0.02 0.98
FOR = fire
TABLE =  0.01 0.99
FOR = alarm
TABLE =  0.5 0.5 0.85 0.15 0.99 0.01 1.0E-4 0.9999
# etc.

网络不直接包含您首先查找具有变量的节点所需的名称,或者使用Xpath进行所有搜索