0

lxml を使用して、XML コンテンツの前後に xml 以外のジャンクが含まれている可能性があるファイルを処理しようとしています。誰かがターミナル バッファをキャプチャしたと想像してください。

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

</log>

user@host:

If I hand etree.parse the filename, it chokes on the beginning content. I can delete the first set of lines until I find a line starting with '<' and hand that to etree.parse, but then it chokes on the closing content. The opening and closing non-xml junk could be anything. I could insist on just valid XML in the files, but I'm trying to be sort of tolerant of my input. Any ideas?

4

2 に答える 2

2

利便性と正確さのバランスに関するもう 1 つのポイントを次に示します。

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 データの前に開始山かっこがあり、データの最後に余分な閉じ山かっこがある場合、これは簡単に失敗します。これは、シェル環境では珍しいことではありません。

代わりに、そのような入力を拒否するだけで、はるかに簡単になります。

于 2013-03-04T18:44:56.400 に答える