Как добавить атрибут к узлу XML в Java 1.4 - PullRequest
7 голосов
/ 30 сентября 2008

Я пытался:

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

Но это приводит к ошибке java.lang.ClassCastException в строке, которая приводит его к Element. mapNode является допустимым узлом. У меня уже есть распечатка

Я думаю, что этот код не работает в Java 1.4. Что мне действительно нужно, так это альтернатива использованию Element. Я пытался сделать

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

Но getAttributes () возвращает ноль на сервере. Хотя это не так, и я использую тот же документ локально, что и на сервере. И он может распечатать getNodeName () просто потому, что getAttributes () не работает.

Ответы [ 4 ]

1 голос
/ 01 октября 2008

Я использовал другой файл dtd на сервере. Это было причиной проблемы.

0 голосов
/ 30 сентября 2008

Я думаю, что ваше приведение к выводу doc.getFirstChild () - это то место, где вы получаете свое исключение - вы получаете некоторый объект Nole элемента Node. Номер строки в трассировке стека указывает на эту строку? Возможно, вам потребуется выполнить doc.getChildNodes () и выполнить итерацию, чтобы найти первый дочерний элемент (корень документа), пропуская неэлементные узлы.

Ваш вызов e.setAttribute () выглядит разумным. Предполагая, что e является Элементом, и вы на самом деле добираетесь до этой линии ...

0 голосов
/ 30 сентября 2008

Как уже отмечалось, ClassCastException, вероятно, не добавляется в setAttribute. Проверьте номер строки в стеке. Я предполагаю, что getFirstChild() возвращает DocumentType, а не Element.

Попробуйте это:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

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

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

Обновление:

Кажется, вы путаете Node и Element. Element - это реализация Node, но, конечно, не единственная. Таким образом, не все Node можно преобразовать в Element. Если приведение работает на одной машине, а не на другой, это потому, что вы получаете что-то еще из getMapNode(), потому что анализаторы ведут себя по-разному. Синтаксический анализатор XML является подключаемым в Java 1.4, поэтому вы можете получить совершенно другую реализацию от другого поставщика, даже с разными ошибками.

Поскольку вы не публикуете getMapNode(), мы не можем видеть, что он делает, но вы должны четко указать, какой узел вы хотите, чтобы он возвращал (используя getElementsByTagName или иным образом).

0 голосов
/ 30 сентября 2008

Может ли первый дочерний элемент быть текстовым узлом только пробел или что-то подобное?

Попытка:

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

EDIT:

Только что посмотрел в моем собственном коде, вам нужно:

doc.getDocumentElement().getChildNodes();

Или:

NodeList nodes = doc.getElementsByTagName("MyTag");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...