1

最終的に、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

このフォーラムでいくつかの検索を実行しましたが、問題が発生しており、それが私のコードなのか、解析しようとしている xml なのかわかりません。

特定の要素がxmlにあるかどうかを確認できる必要があります。たとえば、以下の xml では、要素 Analyzer が存在するかどうかを確認し、存在する場合は属性を取得する必要があります。次に、Analyzer が存在する場合は、location 要素を確認してテキストを取得し、次に name 要素を確認してそのテキストを取得する必要があります。次のコードは、要素が存在するかどうかを確認すると思いました。

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'
4

1 に答える 1

0

Dive Into Python チュートリアルから 1 つの重要な行が抜けていると思います (ここからすぐ):

子孫要素、つまり子、孫、および任意のネスト レベルの任意の要素を検索する方法があります。

その方法は、要素名の前に//.

tree.find("someElementName")treeは、 という名前の の直接の子要素のみを検索しますsomeElementNamesomeElementName内のどこかにある名前の要素を検索する場合はtree、 を使用しますtree.find("//someElementName")

//表記法は XPath に由来します。ElementTree モジュールは、 の限定されたサブセットのサポートを提供しますXPathElementTreeのドキュメントでは、サポートされている XPath 構文の部分について詳しく説明しています。

于 2016-06-17T18:37:59.583 に答える