2008-09-30 50 views
7

Traté:¿Cómo añadir un atributo a un nodo XML en Java 1.4

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(f); 
Node mapNode = getMapNode(doc); 
System.out.print("\r\n elementName "+ mapNode.getNodeName());//This works fine. 

Element e = (Element) mapNode; //This is where the error occurs 
//it seems to work on my machine, but not on the server. 
e.setAttribute("objectId", "OBJ123"); 

Pero esto genera un error java.lang.ClassCastException en la línea que lo arroja a elemento. mapNode es un nodo válido. Ya lo tengo imprimiendo

Creo que tal vez este código no funcione en Java 1.4. Lo que realmente necesito es una alternativa al uso de Element. Intenté hacer

NamedNodeMap atts = mapNode.getAttributes(); 
    Attr att = doc.createAttribute("objId"); 
    att.setValue(docId);  
    atts.setNamedItem(att); 

Pero getAttributes() devuelve nulo en el servidor. Aunque no es así y estoy usando el mismo documento localmente que en el servidor. Y puede imprimir getNodeName() simplemente es que getAttributes() no funciona.

+0

¿Podría proporcionar más detalles? ¿Cuál es el seguimiento exacto de la pila? – gizmo

+0

La única información útil que el seguimiento de pila dice es java.lang.ClassCastException – joe

+0

Lo arroja al Elemento e = (Elemento) doc.getFirstChild() línea – joe

Respuesta

1

Estaba usando un archivo dtd diferente en el servidor. Eso estaba causando el problema.

0

¿Podría el primer hijo ser un nodo de texto solo en blanco o similar?

Probar:

System.out.println(doc.getFirstChild().getClass().getName()); 

EDIT:

Sólo busqué en mi propio código, es necesario:

doc.getDocumentElement().getChildNodes(); 

O:

NodeList nodes = doc.getElementsByTagName("MyTag"); 
+0

He actualizado la pregunta. – joe

0

Creo que su lanzamiento de la salida de doc.getFirst Niño() es donde obtienes tu excepción: obtienes un objeto No-Element Node. ¿El número de línea en el seguimiento de la pila apunta a esa línea? Es posible que necesite hacer un doc.getChildNodes() e iterar para encontrar el primer Element child (raíz de doc), salteando nodos No-Element.

Su llamada e.setAttribute() parece razonable. Asumiendo que e es un Elemento y realmente llega a esa línea ...

+0

He actualizado la pregunta. – joe

0

Como ya se mencionó, el ClassCastException probablemente no se está lanzando en setAttribute. Verifica el número de línea en la pila. Mi suposición es que getFirstChild() está devolviendo un DocumentType, no un Element.

Prueba esto:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(f); 

Element e = (Element) doc.getDocumentElement().getFirstChild(); 
e.setAttribute("objectId", "OBJ123"); 

Actualización:

Parece que usted está confundiendo Node y Element. Element es una implementación de Node, pero ciertamente no es la única. Por lo tanto, no todos los Node son moldeables a Element. Si el elenco está trabajando en una máquina y no en otra, es porque está obteniendo algo más de getMapNode() porque los analizadores se comportan de manera diferente. El analizador XML es conectable en Java 1.4, por lo que podría obtener una implementación completamente diferente, de un proveedor diferente, incluso con diferentes errores.

Dado que no está publicando getMapNode() no podemos ver lo que está haciendo, pero debe ser explícito sobre qué nodo desea que vuelva (utilizando getElementsByTagName o de otro modo).

+0

He actualizado la pregunta. – joe

+0

Totalmente de acuerdo con su actualización, si se trata de un analizador diferente en el servidor podría manejar espacios en blanco solo en nodos de texto de forma diferente, lo que causaría el error (dependiendo de cómo se escribe getMapNode) –

Cuestiones relacionadas