Как добавить атрибут к узлу XML в 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");

Но это вызывает ошибку 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 () не работает.

Не могли бы вы предоставить более подробную информацию? Какова точная трассировка стека?

gizmo 30.09.2008 22:12

Единственная полезная информация, о которой говорится в трассировке стека, - это java.lang.ClassCastException.

joe 30.09.2008 22:16

Выбрасывает его в строку Element e = (Element) doc.getFirstChild ()

joe 30.09.2008 22:17

Что сообщает mapNode.getClass (). GetName ()? Если это не элемент, знание того, что это на самом деле, поможет вам решить вашу проблему.

Chris Mazzola 30.09.2008 23:35

То, что узел является допустимым, не означает, что он является элементом. Что печатает getNodeName на обеих машинах?

Garth Gilmour 30.09.2008 23:44

Вероятно, вам следует обновить заголовок вопроса, но он указывает на ваше недоумение. Узел не имеет метода setAttribute; Элемент делает.

Brandon DuRette 30.09.2008 23:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
6
23 496
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Пытаться:

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)

Garth Gilmour 30.09.2008 23:47
Ответ принят как подходящий

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

Другие вопросы по теме