Когда я анализирую этот файл xhtml как xml, анализ такого простого файла занимает около 2 минут. Я обнаружил, что если я удаляю объявление типа документа, оно мгновенно анализируется. Что плохого в том, что этот файл так долго анализируется?
Пример Java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
DocumentBuilder bob = dbf.newDocumentBuilder();
Document template = bob.parse( new InputSource( new FileReader( xmlFile ) ) );
Пример XHTML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ex="http://www.example.com/schema/v1_0_0">
<head><title>Test</title></head>
<body>
<h1>Test</h1>
<p>Hello, World!</p>
<p><ex:test>Text</ex:test></p>
</body>
</html>
Спасибо
Редактировать: Решение
Чтобы на самом деле решить проблему на основе предоставленной информации о том, почему она вообще произошла, я сделал следующие основные шаги:
- Загруженные файлы, связанные с DTD, в папку src / main / resources
- Создал пользовательский EntityResolver для чтения этих файлов из classpath
- Сказал моему DocumentBuilder использовать мой новый EntityResolver
Я ссылался на этот SO-ответ при этом: Как проверить XML с помощью Java?
Новый EntityResolver
import java.io.IOException;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class LocalXhtmlDtdEntityResolver implements EntityResolver {
/* (non-Javadoc)
* @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String)
*/
@Override
public InputSource resolveEntity( String publicId, String systemId )
throws SAXException, IOException {
String fileName = systemId.substring( systemId.lastIndexOf( "/" ) + 1 );
return new InputSource(
getClass().getClassLoader().getResourceAsStream( fileName ) );
}
}
Как использовать новый EntityResolver:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
DocumentBuilder bob = dbf.newDocumentBuilder();
bob.setEntityResolver( new LocalXhtmlDtdEntityResolver() );
Document template = bob.parse( new InputSource( new FileReader( xmlFile ) ) );