2009-11-22 1 views
4

У меня есть программа, которая нуждается в анализе XML, который содержит объекты символов. Сама программа не нуждается в разрешении, и список из них большой и изменится, поэтому я хочу избежать явной поддержки этих объектов, если смогу.Есть ли Java XML API, который может анализировать документ без разрешения объектов символов?

Вот простой пример:

<?xml version="1.0" encoding="UTF-8"?> 
<xml>Hello there &something;</xml> 

Есть XML API Java, который может анализировать документ успешно без разрешения (нестандартные) символьные сущности? В идеале это переводило бы их в особое событие или объект, который можно было бы обрабатывать специально, но я бы согласился на вариант, который бы молча их подавлял.

Ответ & Пример:

Skaffman дал мне ответ: использовать анализатор 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».

+0

вы можете дать XML-файл примера? – TofuBeer

+1

Если у вас есть объекты, они должны быть определены или ваш документ недействителен. –

ответ

8

STAX API имеет поддержку понятия не заменяет ссылки характера сущности, по пути IS_REPLACING_ENTITY_REFERENCES имущества:

Требуется парсер заменить внутренние ссылки на объекты с их замены текста и сообщать о них в символы

Это может быть установлено в XmlInputFactory, который затем, в свою очередь, используется для построения XmlEventReader или XmlStreamReader. Тем не менее, API должен сказать, что это свойство предназначено только для force для выполнения замены, вместо того, чтобы заставлять его не заменить их. Тем не менее, это стоит попробовать.

+1

Это ТОЧНО, что я хочу. Если вы установите для этого свойства значение false, вы увидите события EntityReference в потоке, из которых вы можете получить имя объекта с помощью метода getName(). –

0

Анализ SAX с помощью org.xml.sax.EntityResolver может удовлетворить вашу цель. Вы могли бы наверняка подавить их, и вы, вероятно, могли бы найти способ оставить их нерешенными.

Это tutorial представляется наиболее актуальным: оно показывает, как разрешать сущности в строки.

+3

Я пробовал это. Похоже, что EntityResolvers используются только для внешних объектов: в этом случае метод resolveEntity (...) не вызывается, а синтаксический анализатор терпит неудачу с «org.xml.sax.SAXParseException: объект« что-то »ссылается , но не объявлен. " –

0

Я не разработчик Java, но я думаю, что Java-классы xml поддерживают аналогичную функциональность .net для этого. IN .net в классе xmlreadersettings вы установили свойство ProhibitDtd false и установили для свойства XmlResolver значение null. Это заставит синтаксический анализатор игнорировать объекты, на которые ссылаются внешние ссылки, не вызывая исключения при их чтении. Я просто выполнил поиск в Google «Java ignore enity» и получил множество хитов, некоторые из которых, похоже, обращаются к этой теме. Я понимаю, что это не полный ответ на ваш вопрос, но он должен указать вам в полезном направлении.

0

работает для меня только при отключении поддержки внешних объектов:

XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); 
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); 
Смежные вопросы