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 123
1234-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 :
Joe123
1234-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