Existe uma API XML Java que possa analisar um documento sem resolver entidades de caractere?

Eu tenho programa que precisa analisar XML que contém entidades de caractere. O programa em si não precisa tê-los resolvido, e a lista deles é grande e vai mudar, então eu quero evitar o suporte explícito para essas entidades, se eu puder.

Aqui está um exemplo simples:

 Hello there &something; 

Existe uma API Java XML que possa analisar um documento com êxito sem resolver entidades de caractere (não padrão)? O ideal seria traduzi-los em um evento especial ou object que pudesse ser tratado especialmente, mas eu preferiria uma opção que os suprima silenciosamente.

Resposta e Exemplo:

Skaffman me deu a resposta: use um analisador StAX com IS_REPLACING_ENTITY_REFERENCES definido como false.

Aqui está o código que eu preparei para testá-lo:

 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()); } } 

Para o XML acima, ele irá imprimir ” Entity Reference: something “.

A API STaX tem suporte para a noção de não replace referências de entidade de caractere por meio da propriedade IS_REPLACING_ENTITY_REFERENCES :

Requer que o analisador substitua as referências internas da entidade pelo seu texto substituto e as relate como caracteres

Isso pode ser definido em um XmlInputFactory , que, por sua vez, é usado para construir um XmlEventReader ou XmlStreamReader . No entanto, a API tem o cuidado de dizer que essa propriedade destina-se apenas a forçar a implementação a realizar a substituição, em vez de forçá-la a não substituí-la. Ainda assim, vale a pena tentar.

Uma análise SAX com um org.xml.sax.EntityResolver pode ser adequada ao seu propósito. Você poderia com certeza suprimi-los, e você provavelmente poderia encontrar uma maneira de deixá-los sem solução.

Este tutorial parece ser o mais relevante: mostra como resolver entidades em strings.

Eu não sou um desenvolvedor Java, mas eu “acho” que as classs Java xml suportam uma funcionalidade semelhante ao .net para realizar isso. Em .net a class xmlreadersettings você definir a propriedade ProhibitDtd false e defina a propriedade XmlResolver como null. Isso fará com que o analisador ignore entidades referenciadas externamente sem lançar uma exceção quando elas forem lidas. Eu acabei de fazer uma pesquisa no google por “Java ignore enity” e recebi muitos accesss, alguns dos quais parecem abordar esse tópico. Eu percebo que isso não é uma resposta total para a sua pergunta, mas deve apontar você em uma direção útil.

Funciona para mim apenas ao desabilitar o suporte de entidades externas:

 XMLInputFactory inputFactory = XMLInputFactory.newInstance(); inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);