【问题标题】:Parsing XML using Python to print values [duplicate]使用 Python 解析 XML 以打印值 [重复]
【发布时间】:2019-04-05 14:04:07
【问题描述】:

我有一个 XML 文件,其中包含通常与勒索软件和恶意软件相关的文件名和文件扩展名。

使用 Python,我想解析“模式值”以简单地打印“模式值”中包含的值。目标是输出到一个简单的文本文件,其中每行显示一个文件名或文件扩展名。

我尝试在 Notepad++ 中使用宏,但失败了。我是一个 Python 菜鸟,我想用 Python 来完成这项工作

以下是 XML 文件:

<?xml version="1.0" ?>
<Root >
    <Header DatabaseVersion = '2.0' ></Header>
    <QuotaTemplates ></QuotaTemplates>
    <DatascreenTemplates ></DatascreenTemplates>
    <FileGroups >
        <FileGroup Name = 'Anti-Ransomware%sFile%sGroups' Id = '{367CFFB7-DDED-4AA8-8E17-203B6B97F411}' Description = '' >
            <Members >
                <Pattern PatternValue = '!!%sRETURN%sFILES%s!!.txt' ></Pattern>
                <Pattern PatternValue = '!!!%sHOW%sTO%sDECRYPT%sFILES%s!!!.txt' ></Pattern>
                <Pattern PatternValue = '!!!%sREAD%sTHIS%s-%sIMPORTANT%s!!!.txt' ></Pattern>
                <Pattern PatternValue = '!!!!!ATENÇÃO!!!!!.html' ></Pattern>
                <Pattern PatternValue = '!!!!!SAVE%sYOUR%sFILES!!!!.txt' ></Pattern>
                <Pattern PatternValue = '!!!-WARNING-!!!.html' ></Pattern>
                <Pattern PatternValue = '!!!-WARNING-!!!.txt' ></Pattern>
                <Pattern PatternValue = '!!!GetBackData!!!.txt' ></Pattern>
                <Pattern PatternValue = '!!!README!!!*.rtf' ></Pattern>
                <Pattern PatternValue = '!!!READ_TO_UNLOCK!!!.TXT' ></Pattern>
                <Pattern PatternValue = '!!!SAVE%sYOUR%sFILES!.bmp' ></Pattern>
                <Pattern PatternValue = '!##%sDECRYPT%sFILES%s##!.txt' ></Pattern>
                <Pattern PatternValue = '!#_DECRYPT_#!.inf' ></Pattern>
                <Pattern PatternValue = '!DMALOCK3.0*' ></Pattern>
                <Pattern PatternValue = '!Decrypt-All-Files-*.txt' ></Pattern>
                <Pattern PatternValue = '!Please%sRead%sMe!.txt' ></Pattern>
                <Pattern PatternValue = '!READ.htm' ></Pattern>
                <Pattern PatternValue = '!Recovery_*.html' ></Pattern>
                <Pattern PatternValue = '!Recovery_*.txt' ></Pattern>
                <etc.../>
            </Members>
        </FileGroup>
    </FileGroups>
</Root>

同样,目标是将每个文件名/文件扩展名输出到新行的文本文件中。例如

test.malware
test.ransomware 
test.virus
etc
etc
etc

提前感谢您的帮助

【问题讨论】:

  • 您的 xml 末尾有一个不匹配的标签:&lt;Members&gt; 没有被 &lt;/NonMembers&gt; 正确关闭
  • 那是因为我大幅修剪了列表,并且没有在末尾附加正确的标签。让我调整一下。
  • 使用实际的 xml 解析器来处理 xml 总是一个好主意,但如果标签错误,它们将无法正常工作。就是这样。
  • 啊, 标签用于排除列表。可以忽略。
  • @Aaron 我想我并不挑剔这是如何完成的——我只是想达到我的最终结果

标签: python xml parsing


【解决方案1】:

python 的标准 xml 解析器通常是 xml.etree.ElementTree 库。

基本用法是首先解析您的 xml,如果您已经以其他方式读取文件(或以其他方式生成字符串,即:从端口读取或东西)。

import xml.etree.ElementTree as ET
tree = ET.parse('myxmlfile.xml')

那么你有很多关于如何找到感兴趣的元素的选择,但我建议使用一些内置的搜索工具,比如ElementTree.iterfind()

for element in tree.iterfind('Pattern'):
    print(element.attrib)

根据结构,此搜索可能没有足够的选择性,但您可以先找到所需的部分(文件组的成员或非成员等),然后从那里执行搜索。

【讨论】:

  • 从示例中,看起来&lt;Pattern&gt; 标签是可以预见的。
  • @PaulMcG OP 显然为简洁起见修剪了 xml,然后我进一步修剪以使其更漂亮。
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2013-07-10
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多