为什么这个元素检查不能使用 python 元素树工作



我最终决定学习如何在Python中解析XML。我正在使用ElementTree只是为了获得基本的理解。我使用Python 2.7.9使用CentOS 6.5。我浏览了以下页面:

http://www.diveintopython3.net/xml.html

https://pymotw.com/2/xml/etree/elementtree/parse.html#traversing-the-parsed-tree-tree

并在此论坛上进行了几次搜索,但是我遇到了一些麻烦,我不确定这是我的代码还是我要解析的XML。

我需要能够验证某些元素是否在XML中。例如,在下面的XML中,我需要检查是否存在元素分析器,如果是,请获取属性。然后,如果存在分析器,我需要检查位置元素并获取文本,然后获取名称元素并获取该文本。我认为以下代码会检查以查看元素是否存在:

if element.find('...') is not None

但这会产生不一致的结果,并且似乎从未找到位置或名称元素。例如:

if tree.find('Alert') is not None:

似乎有效,但是

if tree.find('location') is not None:

if tree.find('Analyzer') is not None:

绝对不起作用。我猜tree.find()函数仅适用于顶级?

那么我该如何进行检查?

这是我的XML:

<?xml version='1.0' encoding='UTF-8'?>
<Report>
  <Alert>
    <Analyzer analyzerid="CS">
      <Node>
        <location>USA</location>
        <name>John Smith</name>
      </Node>
    </Analyzer>
    <AnalyzerTime>2016-06-11T00:30:02+0000</AnalyzerTime>
    <AdditionalData type="integer" meaning="number of alerts in this report">19</AdditionalData>
    <AdditionalData type="string" meaning="report schedule">5 minutes</AdditionalData>
    <AdditionalData type="string" meaning="report type">alerts</AdditionalData>
    <AdditionalData type="date-time" meaning="report start time">2016-06-11T00:25:16+0000</AdditionalData>
  </Alert>
  <Alert>
    <CreateTime>2016-06-11T00:25:16+0000</CreateTime>
    <Source>
      <Node>
        <Address category="ipv4-addr">
          <address>1.5.1.4</address>
        </Address>
      </Node>
    </Source>
    <Target>
      <Service>
        <port>22</port>
        <protocol>TCP</protocol>
      </Service>
    </Target>
    <Classification text="SSH scans, direction:ingress, confidence:80, severity:high">
      <Reference meaning="Scanning" origin="user-specific">
        <name>SSH Attack</name>
        <url> </url>
      </Reference>
    </Classification>
    <Assessment>
      <Action category="block-installed"/>
    </Assessment>
    <AdditionalData type="string" meaning="top level domain owner">PH, Philippines</AdditionalData>
    <AdditionalData type="integer" meaning="alert threshold">0</AdditionalData>
  </Alert>
</Report>

这是我的代码:

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
for child in root: print child
all_links = tree.findall('.//Analyzer')
try:
        print all_links[0].attrib.get('analyzerid')
        ID = all_links[0].attrib.get('analyzerid')
        all_links2 = tree.findall('.//location')
        print all_links2
        try:
                print all_links[0].text
        except:  print "can't print text location"
        if tree.find('location') is None: print 'lost'
        for kid in tree.iter('location'):
                try:
                        location = kid.text
                        print kid.text
                except: print 'bad'
except IndexError: print'There was no Analyzer element'

我认为您缺少从潜水到python教程的一条重要行(就在这里):

那里搜索 descendant elements 的一种方法,即孩子,孙子和任何嵌套水平的任何元素。

这样就是用 //

先于元素名称。

tree.find("someElementName")只会找到带有someElementName名称的tree的直接子元素。如果要搜索tree中任何地方的名为someElementName的元素,请使用tree.find("//someElementName")

//表示法源自XPATH。ElementTree模块为XPath的有限子集提供了支持。ElementTree文档详细介绍了它支持的XPath语法部分。

最新更新