2009-12-15 5 views
1

Мне нужен валидированный DomTree с DTD (для использования getElementById). Проверка и Синтаксический работает, но дом does't работу правильно:От Sax to Dom с DTD (python)

from xml.dom import minidom 
from xml.dom.pulldom import SAX2DOM 
from lxml import etree 
import lxml.sax 
from StringIO import StringIO 

data_string = """\ 
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE foo [ 
<!ELEMENT foo (bar)*> 
<!ELEMENT bar (#PCDATA)> 
<!ATTLIST bar id ID #REQUIRED>]><foo><bar id="nr_0">text</bar></foo> 
""" 

#parser, with vali. at parsing 
etree_parser = etree.XMLParser(dtd_validation=True,attribute_defaults=True) 
#parse it 
sax_tree = etree.parse(StringIO(data_string),etree_parser); 
handler = SAX2DOM(); 
lxml.sax.saxify(sax_tree,handler); 
domObject = handler.document; 

print domObject.getElementById("nr_0"); 
#returns None 

print minidom.parseString(data_string).getElementById("nr_0"); 
#returns <DOM Element: bar at 0x7f36b77dc0e0> 

Кажется, что SAX2DOM обыкновение проходить ОТД на йот. Я что-то упустил? Я читал, что невозможно загрузить DTD после сборки dom.

любые идеи?

ответ

1

Насколько я знаю: события SAX DTD не обрабатываются ContentHandler, а DTDHandler, который является свойством, которое вы можете установить в саксовом парсере (XMLReader). Это означает, что вы не можете сделать это без сериализации и повторной обработки документа.

validated_string = etree.tostring(tree) 
domDocument = minidom.parseString(validated_string) 

С другой стороны: если вы действительно не нужен minidom документ, вы бы лучше просто остаться с деревом LXML. (вы можете использовать xpath для эквивалента getElementById или посмотреть на etree.XMLDTDID и etree.parseid)

+0

Хммм, я думаю, вы правы. Репарация на самом деле не вариант. Я немного поработал над ертре, похоже, что это лучше, чем мини-юмор во всех отношениях. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^