Я старался:
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 () возвращает null на сервере. Хотя это не так, и я использую тот же документ локально, что и на сервере. И он может распечатать getNodeName (), потому что getAttributes () не работает.
Единственная полезная информация, о которой говорится в трассировке стека, - это java.lang.ClassCastException.
Выбрасывает его в строку Element e = (Element) doc.getFirstChild ()
Что сообщает mapNode.getClass (). GetName ()? Если это не элемент, знание того, что это на самом деле, поможет вам решить вашу проблему.
То, что узел является допустимым, не означает, что он является элементом. Что печатает getNodeName на обеих машинах?
Вероятно, вам следует обновить заголовок вопроса, но он указывает на ваше недоумение. Узел не имеет метода setAttribute; Элемент делает.




Может ли первый дочерний элемент быть текстовым узлом, состоящим только из пробелов, или чем-то подобным?
Пытаться:
System.out.println(doc.getFirstChild().getClass().getName());
Обновлено:
Просто посмотрел в моем собственном коде, вам нужно:
doc.getDocumentElement().getChildNodes();
Или же:
NodeList nodes = doc.getElementsByTagName("MyTag");
Я думаю, что ваш вывод вывода doc.getFirstChild () - это то место, где вы получаете свое исключение - вы получаете объект, не являющийся узлом элемента. Указывает ли номер строки в трассировке стека на эту строку? Возможно, вам потребуется выполнить doc.getChildNodes () и выполнить итерацию, чтобы найти первый дочерний элемент Element (корень документа), пропуская неэлементные узлы.
Ваш вызов e.setAttribute () выглядит разумным. Предполагая, что e - это элемент, и вы действительно дойдете до этой строки ...
Как уже отмечалось, 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 или иначе).
Полностью согласен с вашим обновлением, если это другой парсер на сервере, он может по-разному обрабатывать только пробельные текстовые узлы, что может вызвать ошибку (в зависимости от того, как написано getMapNode)
Я использовал другой файл dtd на сервере. Это было причиной проблемы.
Не могли бы вы предоставить более подробную информацию? Какова точная трассировка стека?