2016-08-09 19 views
8

Đang cố gắng để phân tích tập tin XML vào ElementTree:Python XML: ParseError: rác sau khi yếu tố tài liệu

>>> import xml.etree.cElementTree as ET 
>>> tree = ET.ElementTree(file='D:\Temp\Slikvideo\JPEG\SV_4_1_mask\index.xml') 

tôi nhận được lỗi sau:

Traceback (most recent call last): File "", line 1, in File "C:\Program Files\Anaconda2\lib\xml\etree\ElementTree.py", line 611, in init self.parse(file) File "", line 38, in parse ParseError: junk after document element: line 3, column 0

tập tin XML bắt đầu như thế này:

<?xml version="1.0" encoding="UTF-8" ?> 
<Version Writer="E:\d\src\Modules\SceneSerialization\src\mitkSceneIO.cpp" Revision="$Revision: 17055 $" FileVersion="1" /> 
<node UID="OBJECT_2016080819041580480127"> 
    <source UID="OBJECT_2016080819041550469454" /> 
    <data type="LabelSetImage" file="hfbaaa_Bolus.nrrd" /> 
    <properties file="sicaaa" /> 
</node> 
<node UID="OBJECT_2016080819041512769572"> 
    <source UID="OBJECT_2016080819041598947781" /> 
    <data type="LabelSetImage" file="ifbaaa_Bolus.nrrd" /> 
    <properties file="ticaaa" /> 
</node> 

được theo sau bởi nhiều nút khác.

Tôi không thấy bất kỳ thư rác nào trong dòng 3, cột 0? Tôi cho rằng phải có một lý do khác cho lỗi này.

Tệp .xml được tạo bởi phần mềm bên ngoài MITK vì vậy tôi cho rằng điều đó sẽ ổn.

Làm việc trên Win 7, 64 bit, VS2015, Anaconda

+0

XML đó không được định dạng đúng. Không có phần tử gốc chứa tất cả các phần tử khác. –

+0

Không liên quan đến câu hỏi, bạn nên xem xét việc thoát chuỗi ký tự đường dẫn Windows ("... \\ ...") hoặc sử dụng chuỗi thô (r "... \ ..."). –

+0

@Martin: cảm ơn, đồng ý. Thực hiện điều đó trong các phần khác của mã. – jdelange

Trả lời

8

Như @Matthias Wiehl cho biết, ElementTree chỉ mong đợi một nút gốc duy nhất và không phải là XML được định dạng tốt và phải được cố định tại nguồn gốc của nó. Để giải quyết sự cố, bạn chỉ cần thêm nút gốc giả vào tài liệu.

import xml.etree.cElementTree as ET 
import re 

with open("index.xml") as f: 
    xml = f.read() 
tree = ET.fromstring(re.sub(r"(<\?xml[^>]+\?>)", r"\1<root>", xml) + "</root>") 
+0

Martin, đó là một sửa chữa thanh lịch. Điều này làm việc khi import etree.ElementTree, nếu tôi sử dụng cEmelentTree, tôi nhận được một lỗi trong cElementTree.py un (nông) đối tượng có thể sao chép kiểu . Tôi cần phải tìm ra lý do. – jdelange

2

Các nút gốc của tài liệu của bạn (Version) được mở đóng cửa vào dòng 2. phân tích cú pháp không mong đợi bất kỳ nút sau khi nút gốc. Giải pháp là loại bỏ dấu gạch chéo về phía trước.

+1

Giả sử tôi cần phải phân tích cú pháp tệp này (tôi không thể tạo định dạng khác), điều gì sẽ là sửa chữa nhanh? Sao chép tệp và tạo giả được định dạng đúng rồi phân tích cú pháp đó? Tôi nên thay đổi điều gì? Tôi có nên đặt dấu gạch chéo ở cuối tài liệu không? – jdelange

+0

Như đã được chỉ ra một cách chính xác, tài liệu không được định dạng đúng. Phần mềm tạo ra nó bị hỏng. Bạn nên gửi báo cáo lỗi. –

0

Thử sửa tài liệu như thế này. Đóng phần tử version ở cuối

<?xml version="1.0" encoding="UTF-8" ?> 
<Version Writer="E:\d\src\Modules\SceneSerialization\src\mitkSceneIO.cpp" Revision="$Revision: 17055 $" FileVersion="1"> 
    <node UID="OBJECT_2016080819041580480127"> 
     <source UID="OBJECT_2016080819041550469454" /> 
     <data type="LabelSetImage" file="hfbaaa_Bolus.nrrd" /> 
     <properties file="sicaaa" /> 
    </node> 
    <node UID="OBJECT_2016080819041512769572"> 
     <source UID="OBJECT_2016080819041598947781" /> 
     <data type="LabelSetImage" file="ifbaaa_Bolus.nrrd" /> 
     <properties file="ticaaa" /> 
    </node> 
</Version> 
+0

Điều này cũng hoạt động, vì vậy nó tốt để thử nghiệm. – jdelange

Các vấn đề liên quan