2017-07-31 50 views
2

我有Python脚本来将XML文件解析为另一个平台更友好的格式。在Python中测试一个空的xml文件

每隔一段时间,其中一个数据文件不包含任何数据 - 只有编码信息和其他标记,这会导致ElementTree在找到它们时抛出ParseError。

<?xml version="1.0" encoding="utf-8"?> 

有没有在调用ElementTree之前测试空文件的方法?

Ta。

+0

可能是数据中的“<”字符?如果你找到1,那么文件可能是空的。 –

+0

Err,'endswith(“?>”)''怎么样? –

回答

0

当然有几种方法,使用方法:

try: 
    pass # delete this and add your parse code 
except: 
    pass # write your exception when empty 

或使用if语句:

if (some code to evalue if xml is not empty): 
    # your code 
elif (some code to check if .xml is empty): 
    # your code 

让我知道是怎么回事!

+0

谢谢 - 尝试/捕捉正是我所期待的。 – TheFormerAstronomer

+0

如果我的回答在某种程度上有帮助,请投票! ( :) – Manu

+0

我做过了 - 显然我没有足够的积分来计算它,对不起;( – TheFormerAstronomer

0

当然你可以发现lxml抛出的异常。如果你想避免解析,你可以检查,如果该文件只包含一个<符号:

with open("input.xml","rb") as f: 
    contents = f.read() 
    if contents.count(b"<")<=1: 
     # empty or only header: skip 
     pass 
    else: 
     x = etree.XML(contents) 

当然这种启发式的方法不能从其他解析错误保护。所以最好只保护try/except块的解析。

但是,如果你有很多损坏的单行“头只”文件,这种方法的优点是速度非常快。

1

你应该请求原谅不允许这里。

通过将代码包装在try/except块中来处理异常。

import xml.etree.ElementTree as ET 
... 
try:  
    tree = ET.parse(fooxml) 
except ET.ParseError: 
    # log error 
    pass 
+0

谢谢 - 这看起来很完美,我有其他编程经验,但我的Python知识有点不到8个小时,我必须急于做到这一点;) – TheFormerAstronomer

+0

@TheFormerAstronomer你有足够的点接受答案... –