Parar um fluxo XML sem elemento raiz
Preciso analisar um fluxo contínuo de elementos XML bem formados, aos quais recebi apenas um @ já construíjava.io.Reader
objeto. Esses elementos não estão incluídos em um elemento raiz nem são anexados a um cabeçalho XML como<?xml version="1.0"?>"
, mas são XML válidos.
Usando o Javaorg.xml.sax.XMLReader
class não funciona, porque o XML Reader espera analisar XML bem formado, começando com um elemento raiz anexo. Então, ele apenas lê o primeiro elemento do fluxo, que ele percebe como raiz, e falha no próximo, com o típico
org.xml.sax.SAXParseException: a marcação no documento após o elemento raiz deve estar bem formad
Para arquivos que não contêm um elemento raiz, mas onde esse elemento existe ou pode ser definido (e é chamado, digamos, MyRootElement), é possível fazer algo como o seguinte:
Strint path = <the full path to the file>;
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
StringBuilder buffer = new StringBuilder();
buffer.append("<?xml version=\"1.0\"?>\n");
buffer.append("<!DOCTYPE MyRootElement ");
buffer.append("[<!ENTITY data SYSTEM \"file:///");
buffer.append(path);
buffer.append("\">]>\n");
buffer.append("<MyRootElement xmlns:...>\n");
buffer.append("&data;\n");
buffer.append("</MyRootElement>\n");
InputSource source = new InputSource(new StringReader(buffer.toString()));
xmlReader.parse(source);
Testei o acima, salvando parte dojava.io.Reader
gera um arquivo e funciona. No entanto, essa abordagem não é aplicável no meu caso e essas informações extras (cabeçalho XML, elemento raiz) não podem ser inseridas, pois ojava.io.Reader
objeto passado para o meu código já está construíd
Essencialmente, estou procurando "análise XML fragmentada". Então, minha pergunta é: isso pode ser feito usando APIs Java padrão (incluindo oorg.sax.xml.*
ejava.xml.*
pacotes)?