7 Stimmen

Hinzufügen eines Attributs zu einem XML-Knoten in Java 1.4

Ich habe es versucht:

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");

Dies führt jedoch zu einem java.lang.ClassCastException-Fehler in der Zeile, in der es in Element umgewandelt wird. mapNode ist ein gültiger Knoten. Ich habe es bereits ausgedruckt

Ich denke, dass dieser Code vielleicht nicht in Java 1.4 funktioniert. Was ich wirklich brauche, ist eine Alternative zur Verwendung von Element. Ich habe versucht, tun

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

Aber getAttributes() gibt auf dem Server null zurück. Auch wenn es nicht der Fall ist und ich lokal dasselbe Dokument wie auf dem Server verwende. Und es kann den getNodeName() ausdrucken, nur dass getAttributes() nicht funktioniert.

1voto

joe Punkte 16198

Ich habe eine andere dtd-Datei auf dem Server verwendet. Das war die Ursache des Problems.

0voto

Garth Gilmour Punkte 10840

Könnte das erste Kind ein Textknoten sein, der nur aus Leerzeichen besteht, oder ähnliches?

Versuchen Sie es:

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

EDIT:

Ich habe gerade in meinem eigenen Code nachgeschaut, den Sie brauchen:

doc.getDocumentElement().getChildNodes();

あるいは:

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

0voto

John M Punkte 12793

Ich denke, Ihre Besetzung der Ausgabe von doc.getFirstChild() ist, wo Sie Ihre Ausnahme erhalten - Sie erhalten einige Nicht-Element-Knoten-Objekt. Zeigt die Zeilennummer im Stacktrace auf diese Zeile? Möglicherweise müssen Sie ein doc.getChildNodes() ausführen und iterieren, um das erste Element-Kind (doc Root) zu finden, wobei Nicht-Element-Knoten übersprungen werden.

Ihr e.setAttribute()-Aufruf sieht sinnvoll aus. Angenommen, e ist ein Element und Sie kommen tatsächlich zu dieser Zeile...

0voto

Brandon DuRette Punkte 4730

Wie bereits erwähnt, ist die ClassCastException wird wahrscheinlich nicht in den Müll geworfen setAttribute . Überprüfen Sie die Zeilennummer im Stapel. Meine Vermutung ist, dass getFirstChild() gibt eine DocumentType , nicht ein Element .

Versuchen Sie dies:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

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

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

Aktualisierung:

Es scheint, als würden Sie die folgenden Punkte verwechseln Node y Element . Element ist eine Implementierung von Node , aber sicher nicht die einzige. Also, nicht alle Node sind belegbar mit Element . Wenn der Wurf auf einem Gerät funktioniert, auf einem anderen aber nicht, liegt das daran, dass Sie etwas anderes von einem anderen Gerät zurückbekommen. getMapNode() weil sich die Parser unterschiedlich verhalten. Der XML-Parser ist in Java 1.4 steckbar, so dass Sie eine völlig andere Implementierung von einem anderen Anbieter erhalten könnten, die sogar andere Fehler aufweist.

Da Sie nicht posten getMapNode() können wir nicht sehen, was es tut, aber Sie sollten explizit angeben, welchen Knoten Sie zurückgeben wollen (mit getElementsByTagName oder anderweitig).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X