Я пытаюсь проанализировать следующий xml, чтобы извлечь определенные данные, а затем в конечном итоге отредактировать данные по мере необходимости.
Вот xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CHECKLIST>
<VULN>
<STIG_DATA>
<VULN_ATTRIBUTE>Vuln_Num</VULN_ATTRIBUTE>
<ATTRIBUTE_DATA>V-38438</ATTRIBUTE_DATA>
</STIG_DATA>
<STIG_DATA>
<VULN_ATTRIBUTE>Rule_Title</VULN_ATTRIBUTE>
<ATTRIBUTE_DATA>More text.</ATTRIBUTE_DATA>
</STIG_DATA>
<STIG_DATA>
<VULN_ATTRIBUTE>Vuln_Discuss</VULN_ATTRIBUTE>
<ATTRIBUTE_DATA>Some text here</ATTRIBUTE_DATA>
</STIG_DATA>
<STIG_DATA>
<VULN_ATTRIBUTE>IA_Controls</VULN_ATTRIBUTE>
<ATTRIBUTE_DATA></ATTRIBUTE_DATA>
</STIG_DATA>
<STIG_DATA>
<VULN_ATTRIBUTE>Rule_Ver</VULN_ATTRIBUTE>
<ATTRIBUTE_DATA>Gen000000</ATTRIBUTE_DATA>
</STIG_DATA>
<STATUS>NotAFinding</STATUS>
<FINDING_DETAILS></FINDING_DETAILS>
<COMMENTS></COMMENTS>
<SEVERITY_OVERRIDE></SEVERITY_OVERRIDE>
<SEVERITY_JUSTIFICATION></SEVERITY_JUSTIFICATION>
</VULN>
The data that I'm looking to pull from this is the STATUS, COMMENTS and the ATTRIBUTE_DATA directly following VULN_ATTRIBUTE that matches == Rule_Ver. So in this example.
Я должен получить следующее: Gen000000 NotAFinding None
Что у меня есть до сих пор, так это то, что я могу легко получить статус и комментарии, но не могу понять часть ATTRIBUTE_DATA. Я могу найти первый (Vuln_Num), затем я попытался добавить индекс, но это дает ошибку «индекс списка вне диапазона».
Вот где я сейчас.
import xml.etree.ElementTree as ET
doc = ET.parse('test.ckl')
root=doc.getroot()
TagList = doc.findall("./VULN")
for curTag in TagList:
StatusTag = curTag.find("STATUS")
CommentTag = curTag.find("COMMENTS")
DataTag = curTag.find("./STIG_DATA/ATTRIBUTE_DATA")
print "GEN:[%s] Status:[%s] Comments: %s" %( DataTag.text, StatusTag.text, CommentTag.text)
Это дает следующий вывод: GEN:[V-38438] Status:[NotAFinding] Comments: None
Я хочу: GEN:[Gen000000] Status:[NotAFinding] Comments: None
Таким образом, конечная цель состоит в том, чтобы иметь возможность анализировать сотни из них и редактировать поле комментариев по мере необходимости. Я не думаю, что часть редактирования будет такой сложной, как только я получу нужный элемент.
Логически я вижу два способа сделать это. Либо перейдите к ATTRIBUTE_DATA[5] и возьмите текст, либо найдите VULN_ATTRIBUTE == Rule_Ver, затем возьмите следующий ATTRIBUTE_DATA.
Я пытался сделать это:
DataTag = curTag.find(".//STIG_DATA//ATTRIBUTE_DATA")[5]
and
DataTag[5].текст`
и оба дают мнеIndexError: list index out of range
Я видел, что в lxml есть get_element_by_id и xpath, но я не могу добавлять модули в эту систему, поэтому для меня это etree.
Заранее спасибо.