Em Java, como analiso XML como uma String em vez de um arquivo?

249

Eu tenho o seguinte código:

DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile);

Como posso analisar o XML contido em uma String em vez de em um arquivo?

Dewayne
fonte
7
Também nota que javax.xml.parsers.DocumentBuilder.parse(string)assume a string é um URI (terrível ...)
Christophe Roussy

Respostas:

479

Eu tenho essa função na minha base de código, isso deve funcionar para você.

public static Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource is = new InputSource(new StringReader(xml));
    return builder.parse(is);
}

veja também essa pergunta semelhante

shsteimer
fonte
3
@shsteimer Estou passando na string xml e está retornando null. Não lança nenhuma exceção. O que deve estar errado?
sattu
@attu: Você deve publicá-lo como uma nova pergunta. É realmente difícil dizer sem ver seu código.
Alexander Malakhov
muito obrigado, me salvou linhas de código, eu estava convertendo-o novamente em texto, mas eu sabia que havia uma maneira melhor!
Nkebelbeck
3
se eu tiver <? XML> ele retorna um nó vazio, o que posso fazer?
Dejell
1
Verifique se você usa a instrução de importação correta:import org.xml.sax.InputSource;
Daniel Eisenreich
18

Uma maneira é usar a versão da análise que utiliza um InputSource em vez de um arquivo

Um SAX InputSource pode ser construído a partir de um objeto Reader. Um objeto Reader é o StringReader

Então, algo como

parse(new InputSource(new StringReader(myString))) may work. 
Uri
fonte
5

javadocs mostram que o método de análise está sobrecarregado.

Crie um StringStream ou InputSource usando sua string XML e você deve estar definido.

duffymo
fonte
4

Converta a string em um InputStream e passe-a para DocumentBuilder

final InputStream stream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
builder.parse(stream);

EDIT
Em resposta a bendin 's comentário sobre codificação, consulte shsteimer ' s resposta a esta pergunta.

Akbar ibrahim
fonte
1
Eu preferiria o StringReader porque evita String.getBytes (), mas isso geralmente deve funcionar também.
Michael Myers
3
Quando você chama getBytes (), qual codificação você espera que ela use? Como você está dizendo ao analisador XML que codificação está recebendo? Você espera adivinhar? O que acontece quando você está em uma plataforma em que a codificação padrão não é UTF-8?
22410 bendin
2

Eu estou usando esse método

public Document parseXmlFromString(String xmlString){
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputStream inputStream = new    ByteArrayInputStream(xmlString.getBytes());
    org.w3c.dom.Document document = builder.parse(inputStream);
    return document;
}
Yasir Shabbir Choudhary
fonte
0

Você pode usar o pacote Scilca XML Progession disponível no GitHub.

XMLIterator xi = new VirtualXML.XMLIterator("<xml />");
XMLReader xr = new XMLReader(xi);
Document d = xr.parseDocument();
Shukant Pal
fonte
0

apenas insira

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
lgb
fonte