Harici bir katalog dosyası kullanarak bu belgeyi DTD'sine karşı doğrulamak için bir XML belgesini lxml kullanarak ayrıştırdığım bir yol var mı? Bir belgenin DTD'sinde tanımlanan sabit öznitelikleri kullanabilmem gerekir.Python'un lxml ile bir XML kataloğu kullanıyor musunuz?
cevap
Bir örnek verebilir misiniz? lxml validation docs'a göre, lxml, düşündüğüm çoğu vakayı kapsayan DTD doğrulamasını (XML belgesinde veya harici olarak kodda) ve sistem kataloglarını işleyebilir.
f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")
kaynak sadece hata işleme için bazı #DEFINEs çıkıyor grepping, bu libxml2 özelliği açığa etmediğini LXML görünüyor: catalog implementation in libxml2 page itibaren
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
mümkün görünüyor ki 'şeffaf'/etc/xml/catalog içinde yükleme yoluyla işlenmesi hala lxml'de çalışabilir, ancak bundan daha fazlasına ihtiyacınız varsa, her zaman lxml'yi terk edebilir ve katalog işlevlerini açığa çıkaran varsayılan python bağlamaları kullanabilirsiniz.
Sen XML_CATALOG_FILES
ortam değişkeni katalog ekleyebilirsiniz:
os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'
this thread bakınız. XML_CATALOG_FILES
'daki girişlerin boşlukla ayrılmış URL'leri olduğunu unutmayın. URL'yi bir yol adından oluşturmak için Python'un pathname2url
ve urljoin
'u (file:
ile) kullanabilirsiniz.