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