0

我正在尝试使用 lxml 处理在 XML 内容之前和之后可能有一些非 xml 垃圾的文件,想象有人捕获了一个终端缓冲区,我有这样的东西:

user@host: cat /tmp/log.xml
<log>
  <foo>...</foo>
  <bar>..
...
</bar>

</log>

user@host:

如果我交给 etree.parse 文件名,它会阻塞开始的内容。我可以删除第一组行,直到找到以“<”开头的行并将其交给 etree.parse,但随后它会阻塞关闭内容。打开和关闭的非 xml 垃圾可以是任何东西。我可以坚持在文件中只使用有效的 XML,但我试图容忍我的输入。有任何想法吗?

4

2 回答 2

2

这是便利性和正确性之间平衡的另一点:

import re

xml = re.search(r"<(\w+).*</\1>", console_output, flags=re.DOTALL).group()

它需要以上述格式给出的单个根标签。

于 2013-03-04T18:52:34.257 回答
0

最多你可以从前面清除所有不是开尖括号的东西,以及从末端清除所有不是闭合尖括号的东西:

data = data[data.find('<'):data.rfind('>')]

但是,如果在实际 XML 数据之前的开头有任何左尖括号,并且在数据末尾有任何额外的右尖括号,这将很容易失败。这在 shell 环境中并不少见。

如果您只是拒绝任何此类输入,那对您来说会容易得多。

于 2013-03-04T18:44:56.400 回答