2008-08-15 35 views
7

Có cách nào, khi tôi phân tích cú pháp một tài liệu XML bằng lxml, để xác thực tài liệu đó chống lại DTD của nó bằng cách sử dụng một tệp danh mục bên ngoài? Tôi cần để có thể làm việc các thuộc tính cố định được định nghĩa trong DTD của tài liệu.Sử dụng một danh mục XML với lxml của Python?

Trả lời

1

Bạn có thể đưa ra ví dụ không? Theo lxml validation docs, lxml có thể xử lý xác thực DTD (được chỉ định trong tài liệu XML hoặc mã bên ngoài) và danh mục hệ thống, bao gồm hầu hết các trường hợp tôi có thể nghĩ đến.

f = StringIO("<!ELEMENT b EMPTY>") 
dtd = etree.DTD(f) 
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN") 
0

Dường lxml mà không vạch trần tính năng libxml2 này, grepping nguồn duy nhất lần lượt lên một số # định nghĩa cho việc xử lý lỗi:

C:\Dev>grep -ir --include=*.px[id] catalog lxml-2.1.1/src | sed -r "s/\s+/ /g" 
lxml-2.1.1/src/lxml/dtd.pxi: catalog. 
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_FROM_CATALOG = 20 # The Catalog module 
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_WAR_CATALOG_PI = 93 # 93 
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_MISSING_ATTR = 1650 
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_ENTRY_BROKEN = 1651 # 1651 
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_PREFER_VALUE = 1652 # 1652 
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_NOT_CATALOG = 1653 # 1653 
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_RECURSION = 1654 # 1654 
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG=20 
lxml-2.1.1/src/lxml/xmlerror.pxi:WAR_CATALOG_PI=93 
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_MISSING_ATTR=1650 
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_ENTRY_BROKEN=1651 
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_PREFER_VALUE=1652 
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_NOT_CATALOG=1653 
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_RECURSION=1654 

Từ catalog implementation in libxml2 page có vẻ như có thể là 'minh bạch' việc xử lý thông qua cài đặt trong/etc/xml/catalog vẫn có thể hoạt động trong lxml, nhưng nếu bạn cần nhiều hơn, bạn luôn có thể bỏ lxml và sử dụng các ràng buộc python mặc định, làm lộ các hàm danh mục.

6

Bạn có thể thêm các cửa hàng để biến XML_CATALOG_FILES môi trường:

os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml' 

Xem this thread. Lưu ý rằng các mục nhập trong XML_CATALOG_FILES là các URL được phân cách bằng dấu cách. Bạn có thể sử dụng số pathname2urlurljoin của Python (với file:) để tạo URL từ tên đường dẫn.

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