Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] leer un determinado nodo de un xml

Estas en el tema de leer un determinado nodo de un xml en el foro de Java en Foros del Web. Hola! Tengo el siguiente xml: <?xml version="1.0" encoding="UTF-8"?> <llamada> <Func>Altas</Func> <Param>Varios parametros</Param> </llamada> Quiero obtener el texto de <Func>. como puedo obtenerlo especificando el nombre ...
  #1 (permalink)  
Antiguo 02/06/2015, 11:21
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 9 años, 6 meses
Puntos: 0
leer un determinado nodo de un xml

Hola!

Tengo el siguiente xml:
<?xml version="1.0" encoding="UTF-8"?>
<llamada>
<Func>Altas</Func>
<Param>Varios parametros</Param>
</llamada>

Quiero obtener el texto de <Func>.
como puedo obtenerlo especificando el nombre que ya conozco, en este caso "Func".

Gracias
  #2 (permalink)  
Antiguo 02/06/2015, 11:53
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: leer un determinado nodo de un xml

Lo he solucionado de la siguiente manera, no se si sera la correcta pero funciona:

try {

File fXmlFile = new File("C:\\file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);

doc.getDocumentElement().normalize();

NodeList nlist = doc.getElementsByTagName("Func");
Node nNode = nlist.item(0);
String nfuncion = nNode.getTextContent();
System.out.println("Nombre de la funcion: " + nfuncion);



} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
  #3 (permalink)  
Antiguo 03/06/2015, 05:00
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: leer un determinado nodo de un xml

Dentro del nodo <Param> quiero meter un objeto serializado y luego leerlo. como puedo hacerlo? a la hora de leerlo me da error

Persona p = new Persona("123456789l","Juan Lopez",30)

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);

os.writeObject(p);

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

//elementos root
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("llamada");
doc.appendChild(rootElement);

//Parametros
Element func = doc.createElement("Func");
func.appendChild(doc.createTextNode("Altas"));
rootElement.appendChild(func);

Element func = doc.createElement("Params");
func.appendChild(doc.createTextNode(bos.toString(U TF-8)));
rootElement.appendChild(func);

//aqui escribo el fichero y lo guarda bien

La cuestion es que al leerlo como pongo en el post de antes me sale el siguiente error:
[Fatal Error]fichero.xml:1:106: la referencia de caracter "&#0" no es un caracter XML no válido.
org.xml.sax.SAXParseExpection..................... ...
  #4 (permalink)  
Antiguo 03/06/2015, 05:37
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: leer un determinado nodo de un xml

Buenas,

Utiliza la opcion de "Highlight" del editor porque si no tus posts son totalmente ilegibles.

Por otro lado, cual es el contenido del fichero.xml generado que intentas leer?


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 03/06/2015, 06:17
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: leer un determinado nodo de un xml

http://lists.xml.org/archives/xml-de.../msg00604.html

Parece ser un caracter de null que usa C/C++

http://en.wikipedia.org/wiki/XML

Cita:
"�" is not permitted, however, because the null character is one of the control characters excluded from XML, even when using a numeric character reference.[15] An alternative encoding mechanism such as Base64 is needed to represent such characters.
Como solución se me ocurre que antes de parsear hagas un replace de ese caracter, pero en principio el problema debería ser resuelto en la creación del xml, no en el parseo.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #6 (permalink)  
Antiguo 08/06/2015, 01:25
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: leer un determinado nodo de un xml

Esta es la manera para crear el xml:

Código Java:
Ver original
  1. public static void crearXML(NSGDBean pet){
  2.                
  3.         try {
  4.             //Serializamos
  5.             ByteArrayOutputStream bos = new ByteArrayOutputStream();
  6.             ObjectOutputStream os = new ObjectOutputStream(bos);
  7.            
  8.             os.writeObject(pet);
  9.            
  10.            
  11.             //crear el XML
  12.             DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
  13.             DocumentBuilder docbuilder = docFactory.newDocumentBuilder();
  14.            
  15.             //elementos root
  16.             Document doc = docbuilder.newDocument();
  17.             Element rootElement = doc.createElement("ACCIONES_NSGD");
  18.             doc.appendChild(rootElement);
  19.            
  20.             //Parametros
  21.             Element func = doc.createElement("FUNCION");
  22.             func.appendChild(doc.createTextNode(pet.getMetodoNSGD()));
  23.             rootElement.appendChild(func);
  24.            
  25.             System.out.println(bos.toString());
  26.            
  27.             Element param = doc.createElement("PARAMETROS");
  28.             param.appendChild(doc.createTextNode(bos.toString("UTF-8")));
  29.             //param.appendChild(doc.createTextNode("todos los parametros"));
  30.             rootElement.appendChild(param);
  31.            
  32.             //escribimos el contenido en el fichero
  33.             TransformerFactory transformerfactory = TransformerFactory.newInstance();
  34.             Transformer transformer = transformerfactory.newTransformer();
  35.             DOMSource source = new DOMSource(doc);
  36.             StreamResult result = new StreamResult(new File("C:\\Downloads\\cierreExpediente.xml"));
  37.            
  38.            
  39.             transformer.transform(source, result);
  40.            
  41.             System.out.println("Fichero guardado!");
  42.            
  43.             //ProxyNSGD.procesaPeticionNSGD(bos.toString());
  44.            
  45.         } catch (ParserConfigurationException e) {
  46.             // TODO Bloque catch generado automáticamente
  47.             e.printStackTrace();
  48.         } catch (TransformerConfigurationException e) {
  49.             // TODO Bloque catch generado automáticamente
  50.             e.printStackTrace();
  51.         } catch (TransformerException e) {
  52.             // TODO Bloque catch generado automáticamente
  53.             e.printStackTrace();
  54.         } catch (IOException e) {
  55.             // TODO Bloque catch generado automáticamente
  56.             e.printStackTrace();
  57.         }
  58.     }

Est el el xml que creo
Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. - <ACCIONES_NSGD>
  3.   <FUNCION>cierreExpediente</FUNCION>
  4.   <PARAMETROS>sr%es.NSGD.Bean.NSGDBeanBLL claseNSGDtLjava/lang/String;L metodoNSGDq~L parametrostLjava/util/List;xptExpedienteNSGDtcierreExpedientesrjava.util.ArrayListx��aIsizexpwtidUsuario_pruebatobjectStore_pruebatidExpediente_pruebax</PARAMETROS>
  5.   </ACCIONES_NSGD>

Este es el error al leer:
Fatal Error] cierreExpediente.xml:1:106: La referencia de carácter "" no es un carácter XML no válido.
org.xml.sax.SAXParseException: La referencia de carácter "" no es un carácter XML no válido.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(U nknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at es.NSGD.Pruebas.Prueba.unserial(Prueba.java:42)
at es.NSGD.Pruebas.Prueba.main(Prueba.java:32)
  #7 (permalink)  
Antiguo 08/06/2015, 03:31
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: leer un determinado nodo de un xml

Pues como puedes ver, el xml que estás generando no sirve para nada.

Tienes dos opciones, o convertir tus objetos a texto o convertir la cadena resultado de ByteArrayOutputStream (ObjectOutputStream) a Base64 de forma que sea admitida en un xml. Evidentemente para recuperar los datos tendrás que hacer el proceso contrario.

¿Has pensado en usar JAXB en vez del DOM ?
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #8 (permalink)  
Antiguo 08/06/2015, 03:47
 
Fecha de Ingreso: mayo-2015
Mensajes: 6
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: leer un determinado nodo de un xml

lo he resuelto codificando en base64.
Muchas gracias a todos!

Etiquetas: determinado, nodo, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:13.