Существует ли API Java XML, который может анализировать документ без разрешения символьных сущностей?
У меня есть программа, которая должна проанализировать XML, который содержит символьные объекты. Сама программа не нуждается в их разрешении, и их список большой и будет меняться, поэтому я хочу избежать явной поддержки этих объектов, если смогу.
Вот простой пример:
<?xml version="1.0" encoding="UTF-8"?>
<xml>Hello there &something;</xml>
Существует ли API Java XML, который может успешно анализировать документ без разрешения (нестандартных) символьных сущностей? В идеале это перевело бы их в особое событие или объект, который мог бы быть обработан специально, но я бы предпочел вариант, который бы молча подавлял их.
Ответ и пример:
Скаффман дал мне ответ: используйте парсер StAX с IS_REPLACING_ENTITY_REFERENCES
установить в ложь.
Вот код, который я набрал, чтобы попробовать его:
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
XMLEventReader reader = inputFactory.createXMLEventReader(
new FileInputStream("your file here"));
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isEntityReference()) {
EntityReference ref = (EntityReference) event;
System.out.println("Entity Reference: " + ref.getName());
}
}
Для приведенного выше XML будет напечатаноEntity Reference: something
".
4 ответа
STaX API поддерживает идею не заменять ссылки на символьные сущности с помощью свойства IS_REPLACING_ENTITY_REFERENCES:
Требует, чтобы синтаксический анализатор заменил внутренние ссылки на сущности их замещающим текстом и сообщил о них как о символах
Это может быть установлено в XmlInputFactory
который затем, в свою очередь, используется для создания XmlEventReader
или же XmlStreamReader
, Однако API осторожно говорит, что это свойство предназначено только для того, чтобы заставить реализацию выполнить замену, а не заставлять ее не заменять их. Тем не менее, стоит попробовать.
У меня работает только при отключении поддержки внешних сущностей:
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
SAX-анализ с org.xml.sax.EntityResolver может удовлетворить ваши цели. Вы могли бы наверняка подавить их, и вы могли бы найти способ оставить их нерешенными.
Этот урок кажется наиболее актуальным: он показывает, как преобразовывать сущности в строки.
Я не Java-разработчик, но я "думаю", что классы Java xml поддерживают аналогичную функциональность.net для достижения этой цели. В.net классе xmlreadersettings вы устанавливаете свойство ProhibitDtd в false и устанавливаете для свойства XmlResolver значение null. Это приведет к тому, что синтаксический анализатор будет игнорировать внешние объекты, на которые ссылаются, без исключения при чтении. Я только что выполнил поиск в Google по запросу "игнорировать Java" и получил много обращений, некоторые из которых, по-видимому, касаются этой темы. Я понимаю, что это не полный ответ на ваш вопрос, но он должен указать вам полезное направление.