2010-07-25 13 views
5

Yüksek kelle:Python'da Amara kitaplığını kullanarak bir XSD Şeması'na karşı bir xml dosyasını nasıl doğrularsınız? Aşağıdaki Q için

Merhaba, İşte Ben Ubuntu Python 2.6 kullanılarak 9.10 denedi, Amara2 (bu arada, Test.xsd aracını xml2xsd kullanılarak oluşturuldu) nedir:

[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===== 

Peki, neden bu hatayı görüyorum? Bu işlev desteklenmiyor mu? Herhangi bir XSD dosyasına işaret etmek için esnekliğini kullanırken bir XML dosyasını bir XSD'ye karşı nasıl doğrulayabilirim? Teşekkürler ve sorularınız varsa lütfen bize bildirin.

+0

Amara Kitaplığı'nı kullanarak eğildiniz mi? –

+0

@movieyoda, hayır, başka bir iyi bir Python xml kitaplığına atlayabilirim. Bununla birlikte, benim mevcut 'amara 'kodumu ona göndermem gerekecek ve bunun için ağrısız bir çözüm bulmayı umuyorum. –

cevap

5

Amara dışında başka bir kütüphane kullanmaya açık iseniz, lxml'u deneyin. Bu oldukça kolay yapmaya çalıştığınız şeyi destekler:

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

Teşekkürler, bir geçit olduğu gibi - amara değiştirebilirim. Nasıl doc.quotes.quote içinde q için benzer bir şey yapabilirim: # Döngü http://wiki.xml3k.org/Amara2/Tutorial dan her iki unsuru alacak? Başlangıçta oto-ciltleme üzerinde satıldım çünkü sözde pythonik bir yol. Ama amara ile olan rahatsızlığım büyüyor ... –

+0

Bu, orijinalden ayrı bir soru. (Ama bunu yaptığım gibi doc.xpath ('tırnak/alıntı') q için xpath ile ...:) lxml ile hemen hemen herhangi bir xml/xsl/xpath/xsd yapabilirsiniz ihtiyacın olan görev. – snapshoe

1

Sana XSD şeması XML dosyası bağlamak için noNamespaceSchemaLocation özellik kullanmak tavsiye edeceğiz. Dosya

<?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> 

Test.xsd aynı dizinde yer almalıdır Test.xsd nereye Sonra XML dosyası test.xml

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

olacaktır. XML şemasını XML dosyasından referans almak ve Python'da çalışması gereken genel bir tekniktir.

Avantajı, her XML dosyası için şema dosyasını bilmeniz gerekmediği olmasıdır. XML dosyasının ayrıştırılması sırasında (etree.parse) otomatik olarak bulunur.

+0

Ancak xml dosyasında (varsa) verilen değil, herhangi bir XSD'ye işaret etme esnekliğini istiyor. – snapshoe

+0

@ ma3204: Birisi bir XML belgesi yazarsa, bir şemaya karşılık gelir. Belgeyi başka bir şemada yorumlamaya çalışmamalısınız. XML bir metalangudur. XSD belirli bir dil tanımlar. Bir dilde yazılmış bir metin var, yorumlamaya çalışmamalısınız, başka bir dilde metin olarak. Dolayısıyla, sadece bir XML belgesi yazan kişi ** bunun için XSD'yi belirleyebilir. – Oleg

+0

Ayrılmış durumdayım, ancak kullanım durumum farklı. Xml, günlük olarak (test için) otomatik olarak üretilir, ancak şema otomatik olarak üretilebildiğinden kesin olarak sabitlenir. –

İlgili konular