2013-10-07 2 views
1

Я хочу разобрать xml-файлы, объявляющие HTML 4.01 Doctype.DTD-анализ с помощью Stax

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
[...] 
</html> 

Я с помощью Stax и XmlResolver для нагрузки местного ОТДА

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); 
xmlInputFactory.setXMLResolver(new LocalXmlResolver()); 
xmlOutputFactory = XMLOutputFactory.newInstance(); 
xmlOutputFactory.createXMLEventWriter(...) 


private static final Map<String, String> DTDS = new HashMap<String, String>(){{ 
    // XHTML 1.0 DTDs 
    put("-//W3C//DTD XHTML 1.0 Strict//EN", "xhtml1-strict.dtd"); 
    put("-//W3C//DTD XHTML 1.0 Transitional//EN", "xhtml1-transitional.dtd"); 
    put("-//W3C//DTD XHTML 1.0 Frameset//EN", "xhtml1-frameset.dtd"); 

    put("-//W3C//DTD HTML 4.01//EN", "strict.dtd"); 
    put("-//W3C//DTD HTML 4.01 Transitional//EN", "loose.dtd"); 
    put("-//W3C//DTD HTML 4.01 Frameset//EN", "frameset.dtd"); 
}}; 

private static final class LocalXmlResolver implements XMLResolver { 

     @Override 
     public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException { 
      Object result = null; 

      String path = XHTML_DTD_PATH + DTDS.get(publicID); 

      if (StringUtils.isNotBlank(path)) { 
       result = getClass().getClassLoader().getResourceAsStream(path); 
      } 
      return result; 
     } 
    } 

я получен ОТДОМ из (w3c web site). Но я должен был изменить этот файл, чтобы удалить все комментарии в узлах, как показано ниже:

<!ENTITY % ContentType "CDATA" 
    -- media type, as per [RFC2045] 
    --> 

<!ENTITY % ContentType "CDATA"> 

Но даже после этих изменений, у меня есть еще эта ошибка:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[184,11] 
Message: The element type is required in the element type declaration. 
    [...] 
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[184,11] 
Message: The element type is required in the element type declaration. 
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598) 
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:83) 

в ОТДЕ файла, линия 184 это:

<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)* > 

любая идея?

Благодаря

ответ

2

HTML является языком SGML, поэтому он имеет SGML DTD. Вы можете найти дополнительную информацию о SGML здесь: http://validator.w3.org/docs/sgml.html

SGML немного отличается от XML, поэтому неудивительно, что синтаксический анализатор XML не может его разобрать.

Основной пример:

комментарии внутри деклараций сущностей (разграниченные с двойным дефисом: --this является comment--) допускается в SGML DTD, тогда как это не на XML DTD.

Для получения дополнительной разницы, пожалуйста, следуйте http://www.w3.org/TR/NOTE-sgml-xml-971215#null

Тем не менее, вы не можете отключить DTD разбора для конкретного ОТДА пути создания вашего собственному XmlResolver

xmlInput = XMLInputFactory.newInstance(); 
xmlInput.setXMLResolver(new XMLResolver() { 
    @Override 
    public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException { 
     ... 
     // Disable dtd validation 
     if ("The public id you except".equals(publicId)) { 
      return IOUtils.toInputStream(""); 
     } 
     ... 
    } 
}); 

Для HTML Parser рассмотрит http://jtidy.sourceforge.net/ или http://jsoup.org/ в виде раствора

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