XML elements into String

Suponha que eu tenha o XML assim :

<person>
  <firstname>Joe</firstname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
</person>

O que eu quero fazer eh gerar uma String com o conteudo entre e por exemplo :

“Joe 1231234-456”

Ate agora eu fiz esse codigo :


public class XMLReader {

    private Document doc ; 
    private Element elem;
    private NodeList nodelist;
    
    public XMLReader(String file) {

	doc = (Document)readfile (file);	

	System.out.print(">> Reading file " + file + " ok !\n\n");	

	elem = doc.getDocumentElement();
		
	nodelist = elem.getElementsByTagName("Person");
	
	System.out.println(">> Total number of nodes 'Person' : " + nodelist.getLength());

    }

    public Object readfile(String filename) {

	Document doc = null;
	
	try {
	    
	    File file1 = new File ( filename );
	    
	    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	    DocumentBuilder db = dbf.newDocumentBuilder();
	    
	    doc = db.parse ( file1 );	    
	    
	} catch (Exception e) {
	    e.printStackTrace();
	}

	return doc ; 
	
	
    }
        
    public static void main(String[] args) {

	new XMLReader(args[0]);	
	
    }
    

}

Esse codigo ta pegando o numero correto elementos “person” mas agora queria pegar tudo o que esta dentro de “person” e concatenar num String. Tem algum jeito de fazer isso?

Qualquer ajuda sera bem-vinda.

//Daniel

fala doido!

Suponhamos que vc receba seu arquivo xml por um request… Ou se for o caso leia o arquivo…
faz assim:

String xml = readXMLFromRequestBody(request);
		Document xmlDoc = null;
		try {
			xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
					.parse(new ByteArrayInputStream(xml.getBytes()));
		} catch (ParserConfigurationException e) {
			System.err.println("Erro ParserConfigurationException: "
					+ e.getMessage());
		} catch (SAXException e) {
			System.err.println("Erro SAXException: " + e.getMessage());
		}

		NodeList firstname = xmlDoc.getElementsByTagName("firstname");
String type = null;
		String responseText = "Nome do cara: ";

for (int i = 0; i < firstname.getLength(); i++) {
			type = firstname.item(i).getFirstChild().getNodeValue();
			if (i == 0) {
				responseText += type;
			} else {
				responseText += ", " + type;
			}
		}
aí dpois vc faz o que quiser com o resultado...

a função readXMLFromRequestBody, supondo que o xml veio de um request. Se for pra ler um arquivo, faz a leitura de boa:

private String readXMLFromRequestBody(HttpServletRequest request) {
		StringBuffer xml = new StringBuffer();
		String line = null;
		try {
			BufferedReader reader = request.getReader();
			while ((line = reader.readLine()) != null) {
				xml.append(line);
			}
		} catch (Exception e) {
			System.err.println("Erro Exception: " + e.getMessage());
		}
		return xml.toString();
	}

É isso aí cara! Isso funciona! Falow!

Opa! Obrigado pela ajuda, se eu fizer isso :

nodelist = elem.getElementsByTagName("firstname");

for (int i = 0; i < nodelist.getLength(); i++) {
    System.out.println(nodelist.item(i).getFirstChild().getNodeValue());
}	

Realmente pega o nome do carinha no XML. Mas nao era bem isso que eu queria :

Tendo esse XML como exemplo :

<person>  
  <firstname>Joe</firstname>  
  <phone>  
    <code>123</code>  
    <number>1234-456</number>  
  </phone>  
</person> 

Eu quero “pegar” tudo que esta entre e (detalhe que eu nao nao quero ter que me preocupar com o nome dos childnodes). Quero pegar tudo isso e jogar pra uma variavel string.

Mas valeu mesmo a ajuda!

Opa! Obrigado pela ajuda, se eu fizer isso :

nodelist = elem.getElementsByTagName("firstname");

for (int i = 0; i < nodelist.getLength(); i++) {
    System.out.println(nodelist.item(i).getFirstChild().getNodeValue());
}	

Realmente pega o nome do carinha no XML. Mas nao era bem isso que eu queria :

Tendo esse XML como exemplo :

<person>  
  <firstname>Joe</firstname>  
  <phone>  
    <code>123</code>  
    <number>1234-456</number>  
  </phone>  
</person> 

Eu quero “pegar” tudo que esta entre e (detalhe que eu nao nao quero ter que me preocupar com o nome dos childnodes). Quero pegar tudo isso e jogar pra uma variavel string. Nao quero os values eu quero o xml mesmo, por exemplo :

Uma String assim :
Joe1231234-456

Minha intencao eh pegar esse fragmento de codigo xml e transformar pra JSON Object.

Mas valeu mesmo a ajuda!

Consegui !!!

To mandando o codigo caso alguem precise :

import javax.xml.transform.dom.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;

public class XMLReader {

    private Document doc ; 
    private Element elem;
    private NodeList nodelist;
    
    public XMLReader(String file) throws Exception {

	Transformer transformer = TransformerFactory.newInstance().newTransformer();
	StreamResult stream = new StreamResult( new StringWriter());

	DOMSource ds = new DOMSource();

	doc = (Document)readfile (file);	

	System.out.print(">> Reading file " + file + " ok !\n\n");	

	doc.getDocumentElement().normalize();

	DOMResult resp = new DOMResult( doc );

	elem = doc.getDocumentElement();
		
	nodelist = elem.getElementsByTagName("person");
	
	System.out.println(">> Total number of nodes 'person' : " + nodelist.getLength());

	for (int i = 0; i < nodelist.getLength(); i++) {	    
	    ds.setNode(nodelist.item(i));
	    transformer.transform(ds, stream);
	    System.out.println(stream.getWriter().toString());

	}			

    }

    public Object readfile(String filename) {

	Document doc = null;
	
	try {
	    
	    File file1 = new File ( filename );
	    
	    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	    DocumentBuilder db = dbf.newDocumentBuilder();
	    
	    doc = db.parse ( file1 );	    
	    
	} catch (Exception e) {
	    e.printStackTrace();
	}

	return doc ; 	
	
    }
        
    public static void main(String[] args) throws Exception {

	new XMLReader(args[0]);	
	
    }
    

}

XML :


<User>
<person>  
  <firstname>Joe</firstname>  
  <phone>  
    <code>123</code>  
    <number>1234-456</number>  
  </phone>  
</person> 
</User>

A saida do programa rodando com esse xml file vai ser :

Reading file …/xml/teste.xml ok !

Total number of nodes ‘person’ : 1

<?xml version="1.0" encoding="UTF-8"?>

Joe

123
1234-456

//Daniel