2010-07-25 59 views
5

tiền thưởng cao cho những điều sau đây Q:Làm cách nào để xác thực tệp xml dựa vào Lược đồ XSD bằng thư viện Amara bằng Python?

Xin chào, Đây là những gì tôi đã cố gắng trên Ubuntu 9.10 sử dụng Python 2.6, Amara2 (bằng cách này, test.xsd được tạo bằng công cụ xml2xsd):

[email protected]:~$ cat test.xml; echo =====o=====; cat test.xsd; echo ==== 
o=====; cat test.py; echo =====o=====; ./test.py; echo =====o===== 
<?xml version="1.0" encoding="utf-8"?>==; ./test.py` > 
test.txttest.xsd; echo === 
<test>abcde</test> 
=====o===== 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified"> 
    <xs:element name="test" type="xs:NCName"/> 
</xs:schema> 
=====o===== 
#!/usr/bin/python2.6 
# I wish to validate an xml file against an external XSD schema. 
from amara import bindery, parse 
source = 'test.xml' 
schema = 'test.xsd' 
#help(bindery.parse) 
#doc = bindery.parse(source, uri=schema, validate=True) # These 2 seem 
to fail in the same way. 
doc = parse(source, uri=schema, validate=True) # So, what is the 
difference anyway? 
# 
=====o===== 
Traceback (most recent call last): 
    File "./test.py", line 14, in <module> 
    doc = parse(source, uri=schema, validate=True) 
    File "/usr/local/lib/python2.6/dist-packages/Amara-2.0a4-py2.6-linux- 
x86_64.egg/amara/tree.py", line 50, in parse 
    return _parse(inputsource(obj, uri), flags, 
entity_factory=entity_factory) 
amara.ReaderError: In file:///home/g/test.xml, line 2, column 0: 
Missing document type declaration 
[email protected]:~$ 
=====o===== 

Vì vậy, tại sao tôi thấy lỗi này? Chức năng này có được hỗ trợ không? Làm cách nào để xác thực tệp XML đối với XSD trong khi có tính linh hoạt để trỏ đến bất kỳ tệp XSD nào? Cảm ơn và cho tôi biết nếu bạn có câu hỏi.

+0

bạn có muốn sử dụng Thư viện Amara không? –

+0

@movieyoda, không, tôi có thể chuyển sang thư viện Python xml tốt khác. Tuy nhiên, tôi sẽ cần phải chuyển mã 'amara' hiện có của tôi sang nó sau đó, và tôi hy vọng sẽ tìm ra một giải pháp không đau cho điều đó. –

Trả lời

5

Nếu bạn đang mở để sử dụng thư viện khác ngoài amara, hãy thử lxml. Nó hỗ trợ những gì bạn đang cố gắng làm khá dễ dàng:

from lxml import etree 

source_file = 'test.xml' 
schema_file = 'test.xsd' 

with open(schema_file) as f_schema: 

    schema_doc = etree.parse(f_schema) 
    schema = etree.XMLSchema(schema_doc) 
    parser = etree.XMLParser(schema = schema) 

    with open(source_file) as f_source: 
     try: 
      doc = etree.parse(f_source, parser) 
     except etree.XMLSyntaxError as e: 
      # this exception is thrown on schema validation error 
      print e 
+0

Cảm ơn, tôi có thể chuyển qua - amara như là một rắc rối. Làm thế nào tôi có thể làm một cái gì đó tương tự như 'cho q trong doc.quotes.quote: # Vòng lặp sẽ nhận cả hai phần tử q từ http://wiki.xml3k.org/Amara2/Tutorial? Ban đầu tôi đã được bán trên các ràng buộc tự động, bởi vì nó được cho là cách nhiệt tình. Nhưng, sự khó chịu của tôi với amara đang phát triển ... –

+0

Đó là một câu hỏi riêng biệt từ bản gốc. (Nhưng cách tôi làm điều đó là với xpath ... 'cho q trong doc.xpath ('quotes/quote'): ...') Với lxml bạn có thể làm khá nhiều bất kỳ xml/xsl/xpath/xsd nào công việc bạn cần. – snapshoe

1

Tôi sẽ khuyên bạn nên sử dụng thuộc tính noNamespaceSchemaLocation để ràng buộc tệp XML với lược đồ XSD. Sau đó, file test.xml XML của bạn sẽ được

<?xml version="1.0" encoding="utf-8"?> 
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="test.xsd">abcde</test> 

nơi tệp test.xsd

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 
    <xs:element name="test" type="xs:NCName"/> 
</xs:schema> 

nên được đặt trong cùng thư mục với các test.xsd. Đó là kỹ thuật chung để tham khảo lược đồ XML từ tệp XML và nó sẽ hoạt động trong Python.

Lợi thế là bạn không cần phải biết tệp sơ đồ cho mọi tệp XML. Nó sẽ được tự động tìm thấy trong khi phân tích cú pháp (etree.parse) của tệp XML.

+0

Nhưng ông muốn sự linh hoạt để trỏ đến bất kỳ XSD, không chỉ là một trong những được đưa ra trong tập tin xml (nếu có). – snapshoe

+0

@ ma3204: Nếu ai đó viết một tài liệu XML, anh ta viết nó tương ứng với một lược đồ. Bạn không nên cố gắng diễn giải tài liệu trong lược đồ khác. XML là một ngôn ngữ kim loại. XSD định nghĩa một ngôn ngữ cụ thể. Nó bạn có một văn bản được viết bằng một ngôn ngữ mà bạn không nên cố gắng giải thích là một văn bản trong một ngôn ngữ khác. Vì vậy, chỉ người ** viết ** tài liệu XML mới có thể chỉ định XSD cho nó. – Oleg

+0

Tôi đã bỏ phiếu, nhưng trường hợp sử dụng của tôi khác. Xml được tạo tự động hàng ngày (để thử nghiệm), nhưng giản đồ được sửa chữa chính xác bởi vì trình tạo tự động có thể hoạt động. –

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