访问计算机文件中的 XML 数据 [复制]

acessing xml data in machine files [duplicate]

提问人:Nathan Seiler 提问时间:8/21/2023 更新时间:8/21/2023 访问量:46

问:

我想阅读一些机器数据的分析日志。我要读取的数据以 xml 格式编写,但位于文件末尾。 我遇到了一个问题,即文件以不可读的机器数据开头,并且我找不到读取文件和访问xml数据的方法。 由于机器数据是用 1000 多行代码编写的,因此我最喜欢的是忽略机器数据,只读入 xml 数据。 此外,这些文件不是在 .xml 上结束,而是在 .wve 上结束

帮助将不胜感激!

下面是该文件的示例

python xml xml 解析

评论

0赞 guidot 8/21/2023
这似乎非常丑陋,因为即使是 XML 部分也缺少所需的版本标头,因此不会被视为有效。通过体面的工具。我可能会先编写一个单独的工具/例程,提取 xml 部分并将其写入单独的文件;我猜,在机器数据中偶然发现的概率非常低。<version>
0赞 mzjn 8/21/2023
可读部分看起来不像正确的 XML。结束标记上有属性,这是不允许的。
0赞 kjhughes 8/21/2023
那个文件是一团糟。1.扫描到您认为是“XML”的开头。2. 尝试重复链接中给出的技术。3. 斥责负责生成该数据的一方。
0赞 Nathan Seiler 8/23/2023
谢谢大家的评论。也许我的“xml”数据并不像我发布的那么糟糕。(手指交叉)但目前我可能必须将数据作为文本进行处理。好吧,看...

答:

0赞 Paolo Sini 8/21/2023 #1

使用几个假设:

  • 如果我们确定标签始终存在<Version>
  • 如果我们确定标签始终是第一个标签<Version>

然后我们可以寻找它并丢弃之前的所有内容,如下所示:

# Use your file name instead of `data.wve` here
with open("data.wve") as data_file:
    file_content = data_file.read()

# Split the content of the file in 2 parts, starting at the version tag
xml_data = file_content.split("<Version", 1)[1]
# Because the `split` method removes the separator, place it back at the begining of the string
xml_data = "<Version" + xml_data
print(xml_data)

然后,您可以在此处查看 python 标准库 XML 处理模块,以解析剩余的 XML 数据。

评论

1赞 Michael Kay 8/21/2023
除了后面的东西不是 XML - 它在结束标记中具有属性。<version>
1赞 Nathan Seiler 8/23/2023
感谢您帮助我找到我想处理的文件部分。数据不是我没有意识到的 xml,因为我是这个领域的新手。但是,我猜是出了点什么。
0赞 artygo 8/21/2023 #2

正如 mzjn 所强调的,本文档不是 XML,这意味着您将不得不手动解析它......

如果仍要提取“XML like”部分,可以按如下步骤操作:

with open('awesome.wve', 'rb') as f:
    content = f.read()

# the last '>' will be the end of the pseudo_xml
end_of_pseudo_xml = content.rfind(b'>') + 1

# the last tag will be something like </someTag>
ending_tag = content[content.rfind(b'<') : end_of_pseudo_xml]

# the first tag will be something like <someTag> or <someTag some_value="V">
first_tag = ending_tag.replace(b'</', b'<').replace(b'>', b'')

# the pseudo_xml will be something like <someTag...> ... </someTag>
pseudo_xml = content[content.find(first_tag) : end_of_pseudo_xml]

# from bytes to string
pseudo_xml = pseudo_xml.decode()

请注意,使用 to 从末尾搜索字符串的内容。rfind

评论

1赞 mzjn 8/21/2023
可读内容不是 XML(不允许使用结束标记上的属性)