Estoy analizando (muchos) archivos XML que contienen referencias de entidades que no conozco de antemano (no puede cambiar ese hecho).¿Cómo tratar con referencias de entidades desconocidas?
Por ejemplo:
xml = "<tag>I'm content with &funny; &entity; &references;.</tag>"
cuando trato de analizar esta usando el siguiente código:
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder db = dbf.newDocumentBuilder();
final InputSource is = new InputSource(new StringReader(xml));
final Document d = db.parse(is);
me sale la siguiente excepción:
org.xml.sax.SAXParseException: The entity "funny" was referenced, but not declared.
pero, lo que hago Lo que quiero lograr es que el analizador sustituya a todas las entidades que no están declaradas (desconocidas para el analizador) con una cadena vacía. ''. O mejor aún, ¿hay una manera de pasar un mapa para el analizador como:
Map<String,String> entityMapping = ...
entityMapping.put("funny","very");
entityMapping.put("entity","important");
entityMapping.put("references","stuff");
de modo que pudiera hacer lo siguiente:
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final DocumentBuilder db = dbf.newDocumentBuilder();
final InputSource is = new InputSource(new StringReader(xml));
db.setEntityResolver(entityMapping);
final Document d = db.parse(is);
si iba a obtener el texto del documento utilizando este código de ejemplo que debería recibir:
I'm content with very important stuff.
¿Alguna sugerencia? Por supuesto, ya estaría feliz de simplemente reemplazar la entidad desconocida con cadenas vacías.
Gracias,
No estoy lo suficientemente familiarizado con el conjunto de herramientas SAX para conocer su API, pero me imagino que tiene un '... Resolver' asociado. Esta clase sería responsable de resolver estas referencias. Así es como funciona el modelo .Net. Creo que los conceptos son en gran medida lo mismo. –
¿Te refieres a EntityResolver? Eso ciertamente parece que debería funcionar, pero cuando miro su API no parece estar dirigido a este tipo de entidad. Sin embargo, intentarlo no debería hacer ningún daño. –
'EntityResolver' es para resolver entidades * externas * (por ejemplo, una DTD), pero estamos buscando algo que maneje entidades * internas *. – skaffman