¿Hay una API Java XML que pueda analizar un documento sin resolver entidades de caracteres?

Tengo un progtwig que necesita analizar XML que contiene entidades de caracteres. El progtwig en sí no necesita tenerlos resueltos, y la lista de ellos es grande y cambiará, por lo que quiero evitar el apoyo explícito para estas entidades si puedo.

Aquí hay un ejemplo simple:

 Hello there &something; 

¿Hay una API XML de Java que pueda analizar un documento correctamente sin resolver entidades de caracteres (no estándar)? Idealmente, los traduciría en un evento u objeto especial que podría manejarse de manera especial, pero me conformaría con una opción que los suprimiría silenciosamente.

Respuesta y ejemplo:

Skaffman me dio la respuesta: use un analizador StAX con IS_REPLACING_ENTITY_REFERENCES establecido en falso.

Aquí está el código que preparé para probarlo:

 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 el XML anterior, imprimirá ” Entity Reference: something “.

La API STaX tiene soporte para la noción de no reemplazar referencias de entidad de caracteres, por medio de la propiedad IS_REPLACING_ENTITY_REFERENCES :

Requiere que el analizador sustituya las referencias internas de la entidad por su texto de reemplazo y las informe como caracteres

Esto se puede establecer en un XmlInputFactory , que a su vez se usa para construir un XmlEventReader o XmlStreamReader . Sin embargo, la API tiene cuidado de decir que esta propiedad solo tiene como objective forzar a la implementación a realizar el reemplazo, en lugar de forzarlo a que no los reemplace. Aún así, vale la pena intentarlo.

Un análisis SAX con un org.xml.sax.EntityResolver puede adaptarse a su propósito. Podrías seguramente suprimirlos, y probablemente puedas encontrar una manera de dejarlos sin resolver.

Este tutorial parece ser el más relevante: muestra cómo resolver entidades en cadenas.

No soy un desarrollador de Java, pero “creo” que las clases Java xml admiten una funcionalidad similar a .net para lograr esto. En .net, la clase xmlreadersettings establece la propiedad ProhibitDtd como falsa y establece la propiedad XmlResolver nula. Esto hará que el analizador ignore las entidades referenciadas externamente sin lanzar una excepción cuando se leen. Acabo de hacer una búsqueda en Google de “Java ignore enity” y recibí muchos hits, algunos de los cuales parecen abordar este tema. Me doy cuenta de que esta no es una respuesta total a su pregunta, pero debería indicarle una dirección útil.

Funciona solo para mí cuando deshabilita el soporte de entidades externas:

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