Мне нужно разобрать кучу XML файлов на Java, которые иногда и недействительно содержат HTML-объекты, такие как —
, >
и т.д. Я понимаю, что правильный способ справиться с этим - добавить подходящие объявления сущностей в файл XML перед разбором. Однако я не могу этого сделать, поскольку я не могу контролировать эти файлы XML.
Есть ли какой-то обратный вызов, который я могу переопределить, который вызывается всякий раз, когда парсер Java XML сталкивается с такой сущностью? Я не смог найти его в API.
Я бы хотел использовать:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = dbf.newDocumentBuilder();
Document doc = parser.parse( stream );
Я обнаружил, что могу переопределить resolveEntity
в org.xml.sax.helpers.DefaultHandler
, но как это использовать с API более высокого уровня?
Вот полный пример:
public class Main {
public static void main( String [] args ) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = dbf.newDocumentBuilder();
Document doc = parser.parse( new FileInputStream( "test.xml" ));
}
}
с test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar>Some text — invalid!</bar>
</foo>
Выдает:
[Fatal Error] :3:20: The entity "nbsp" was referenced, but not declared.
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 20; The entity "nbsp" was referenced, but not declared.
Обновление: я уже пытался найти в исходном коде JDK отладчик, и мальчик, какое количество спагетти. Я понятия не имею, что такое дизайн, или есть ли он. Сколько слоев лука может накладывать один слой друг на друга?
Класс ключей, по-видимому, com.sun.org.apache.xerces.internal.impl.XMLEntityManager
, но я не могу найти какой-либо код, который либо позволяет мне добавлять в него материал до его использования, либо пытается разрешить объекты, не пройдя через этот класс.