Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 21

XML и Java. Как добавить "путсой" элемент

25.09.2013, 02:35. Показов 4115. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть - приложение должно загружать данные из БД в XML и обратно из XML в БД .

Это кусок xml файла.
XML
1
2
3
4
5
 <record>
        <depcode>HR</depcode>
        <depjob>Head</depjob>
        <description><empty></empty></description> // <-- Так я обозначаю пустое поле. 
    </record>
С этой конструкцией поле
Java
1
elem.getElementsByTagName("description").item(0).getChildNodes().item(0).getNodeValue();
равно null. Мне именно так и надо. Когда обрабатываю пустое поле без конструкции <empty></empty> выдает ошибку: java.lang.NullPointerException. В принципе, я в ручную добавила <empty></empty> и все ОК с выгрузкой из файла.

В чем, собственно, проблема. Когда я загружаю данные в файл, и встречается атрибут со значание NULL (такое нередко в БД) то после загрузки в файл, у меня xml выглядит так:
XML
1
2
3
4
5
<record>
       <depcode>HR</depcode>
       <depjob>Head</depjob>
       <description/> // <-- Это я вижу в загруженном файле.
</record>
Кусок кода:
Java
1
2
3
4
Element newElement=document.createElement("record");
Element subElement2 = document.createElement("description");
newElement.appendChild(subElement2);
subElement2.appendChild(document.createTextNode(""));
Как добавить элемент с пустым значением, чтобы он в xml отображался как <description><empty></empty></description>, а НЕ <description/>.
ИЛИ как обработать элемент <description/>, чтобы оно дало значение null?

Помогите, прошу!
Я в xml профан , если есть советы, то прошу излагать предельно понятным языком.

Сорри, если где-то напутала с терминологией.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2013, 02:35
Ответы с готовыми решениями:

Как добавить обводку тексту? Java (XML)
Необходимо добавить обводку текста в адроид студии. Какие параметры использовать для этого? Можно ли сделать это все в xml файле?

Как правильно добавить xml и java файлы в проект?
Привет. Я новичок в Андроиде и Джава. Столкнулся с проблемой. Хочу создать дополнительный активити. Для этого, как я понимаю, надо создать...

C#, Xml.Linq Как добавить элемент?
Есть многомерный массив, как добавить xml элементы перечислив в цикле в нужное место? Здесь Resources добавляются на одном уровне...

32
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
27.09.2013, 18:25
Студворк — интернет-сервис помощи студентам
А Это смотря чем варидировать
если .xml файл пустой, а вы пытаетесь его открыть и распарсить методом DocumentBuilder.parse у Вас свалится SAXException . Как я уже говорил.

Нужно всё это дело обернуть в
Java
1
2
3
4
try { 
   DocumentBuilder.parse(new File("file.xml")) } catch (SAXException e) { 
    делать то что нада при пустом файле. 
}
а можно так :

Java
1
2
3
4
File f = new File("file.xml");
if(f.length()==0) {
    System.out.println("файл пустой");
}
ну и отвечу на ваш вопрос: при пустом файле , до валидации мы даже не доберёмся. Свалимся раньше.
1
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 21
01.10.2013, 17:43  [ТС]
Еще такой вот вопрос. Я делаю выгрузку из БД в xml. Если в БД не было записей, то xml файл выглядит так:

XML
1
2
<?xml version="1.0" encoding="UTF-8"?>
<DepINFO/>
Теперь я пытаюсь из этого файла сделать загрузку в БД. Но выдается ошибка Error is java.lang.NullPointerException.

Что делать с этим xml файлом? Как обработать?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.10.2013, 17:52
Цитата Сообщение от Kamila_ Посмотреть сообщение
Что делать с этим xml файлом? Как обработать?
вам же уже несколько вариантов ответа дали, валидировать перед загрузкой в базу
он у вас невалидный, должен недобраться до базы и сфейлиться на этапе валидации
0
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
01.10.2013, 18:15
Можете код написать? или стек трейс с нулпоинтером ? что бы не гадать на свечах.
0
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 21
01.10.2013, 18:21  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
вам же уже несколько вариантов ответа дали, валидировать перед загрузкой в базу
он у вас невалидный, должен недобраться до базы и сфейлиться на этапе валидации
Почему он не валидный? Один корневой элемент, Child-ов нет (у меня DOM реализован).
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.10.2013, 18:22
Цитата Сообщение от Kamila_ Посмотреть сообщение
Почему он не валидный? Один корневой элемент, Child-ов нет (у меня DOM реализован).
потому что в базе есть таблица соответствующая вашему хмл и в ней скорее всего есть обязательные поля (одно как минимум)

валидность не по хмл, а по структуре докумета, Schema или DTD
0
 Аватар для chizz
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
01.10.2013, 18:24
А где у вас Error is java.lang.NullPointerException.
На каком этапе?

Вам надо сначала добавить пустой элемент, потом убрать... Вы уж определитесь
0
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
01.10.2013, 18:24
ХМЛ у Вас валидный скорее всего, у Вас просто где то не инициализированная переменная которая нуллпоинтер вызывает, что бы её найти нада видеть тот код в котором Вы обрабатываете хмл и желательно стектрейс.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.10.2013, 18:29
warloc69, всё там ок - просто
<DepINFO/> идентичен
DepINFO variable = null;

и если на нём чёто потом вызвать то будет NPE
0
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
01.10.2013, 18:36
Цитата Сообщение от mutagen Посмотреть сообщение
warloc69, всё там ок - просто
<DepINFO/> идентичен
DepINFO variable = null;

и если на нём чёто потом вызвать то будет NPE
Это понятно

я просто хочу указать Камилле явно на кусок кода где это падает )
0
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 21
01.10.2013, 22:22  [ТС]
Мне и загружать, и выгружать надо. Мне, как бы это ужасно это ни звучало, не очень и важно, валидный или нет)) Мне из этого файла ничего извлекать не надо, мне просто нужно распознать ситуацию, когда выгрузка из файла типа

<?xml version="1.0" encoding="UTF-8"?>
<DepINFO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

происходит, и как-то отреагировать. Мне нужно уловить этот момент!

Вот кусок кода, не весь далеко.
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 dbFactory.setIgnoringComments(true);
   dbFactory.setXIncludeAware(true);
   DocumentBuilder documentBuilder = dbFactory.newDocumentBuilder();
   Document document = documentBuilder.parse(xmlFile); 
   document.getDocumentElement().normalize();
   
   if (!document.getDocumentElement().hasChildNodes())
           {logger.info("File is empty");}
   NodeList nodeList = document.getElementsByTagName(document.getDocumentElement().getChildNodes().item(1).getNodeName());
   logger.debug("Root element is: " + document.getDocumentElement().getNodeName());
   logger.debug("My nodeList is: "+document.getDocumentElement().getChildNodes().item(1).getNodeName());
   
   if (nodeList .getLength()==0) 
      logger.info("File is empty");
   else 
      { 
      logger.info("There's "+nodeList.getLength()+"entries in xml");
      logger.info("Checking the keys to the uniqueness");
      for (int i=0; i<nodeList.getLength(); i++)
         {
         Node node = nodeList.item(i);
         if (node.getNodeType()==Node.ELEMENT_NODE)
             {
             Element elem = (Element)node;
             //if (elem.)
             depCode[i] = elem.getElementsByTagName("depcode").item(0).getChildNodes().item(0).getNodeValue();
             depJob[i] = elem.getElementsByTagName("depjob").item(0).getChildNodes().item(0).getNodeValue();
              /** Проверка, является ли значение атрибута "description" равным NULL */
             
             if (elem.getElementsByTagName("description").item(0).getChildNodes().getLength()!=0)
             description[i] = elem.getElementsByTagName("description").item(0).getChildNodes().item(0).getNodeValue();
             
             /** Проверка записей в xml файле на уникальность ключей */
             
             if (!hS_XML.getHashSet().contains(depCode[i].hashCode()+depJob[i].hashCode()))
                  hS_XML.Add(depCode[i].hashCode()+depJob[i].hashCode());
                 
             else { 
                  System.out.println("Error! In the xml file found more than one entry with the same natural key!");
                  System.out.println("Synchronization with the database is not possible");
                  logger.error("Error! In the xml file found more than one entry with the same natural key!");
                  logger.warn("Synchronization with the database is not possible");
                  return;
                  } 
             }
         }
      logger.info("All entries in the xml file has a unique natural key!");
      logger.debug("HashSet for XML:\t"+hS_XML.getHashSet().toString()+" (" +hS_XML.getHashSet().size()+")");

И раз уж пошла такая пьянка, еще спрошу.
Когда я сделала что-то и у меня появилась волшебная строка
XML
1
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/
атрибуты БД, которые принимали значение NULL теперь не отображаются в xml файле вообще.
XML
1
2
3
4
5
6
7
8
9
[COLOR="Red"]-<record>
<depcode>HR1</depcode>
<depjob>Co-worker</depjob>
</record>[/COLOR]
-<record>
<depcode>HR1</depcode>
<depjob>Group leader</depjob>
<description>+170%</description>
</record>
Раньше был такой оператор:
Java
1
2
if (elem.getElementsByTagName("description").item(0).getChildNodes().getLength()!=0)
             description[i] = elem.getElementsByTagName("description").item(0).getChildNodes().item(0).getNodeValue();
Теперь вызывает ошибку NUllPointException( Как можно этот участок обработать?
0
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
02.10.2013, 11:26
Давайте разберём строку

Java
1
if (elem.getElementsByTagName("description").item(0).getChildNodes().getLength()!=0)
что в ней происходит:
1) система в куске elem.getElementsByTagName("description") ищет елемент "description" и не находит возвращая null так как "description" нет в ХМЛ
2) Система в null вызывает item(0). Результат вы получаете NullPointerException
что бы это исправить напишыте так :

Java
1
if (elem.getElementsByTagName("description")!=null && elem.getElementsByTagName("description").item(0).getChildNodes().getLength()!=0)
такие же ошибки у вас в строчках :

Java
1
2
depCode[i] = elem.getElementsByTagName("depcode").item(0).getChildNodes().item(0).getNodeValue();
depJob[i] = elem.getElementsByTagName("depjob").item(0).getChildNodes().item(0).getNodeValue();
Попробуйте понять почему
1
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 21
02.10.2013, 16:26  [ТС]
Цитата Сообщение от warloc69 Посмотреть сообщение

такие же ошибки у вас в строчках :

Java
1
2
depCode[i] = elem.getElementsByTagName("depcode").item(0).getChildNodes().item(0).getNodeValue();
depJob[i] = elem.getElementsByTagName("depjob").item(0).getChildNodes().item(0).getNodeValue();
Попробуйте понять почему
Спасибо!!! Но в последних строчках у меня нет ошибки! если xml без "пустых" записей, то синхронизация с БД на ура проходит. Хотя, надо бы проверять, наверное, и эти значения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2013, 16:26

Как добавить в родительский элемент, другие элементы (XML)
Есть вот так: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;head&gt; &lt;parent folder=&quot;new folder&quot; color=&quot;Aqua&quot;&gt; &lt;note...

Может ли js добавить элемент в файл XML так, чтобы он записался в сам XML-файл?
Всем привет! Подскажите, может ли как-то javascript добавить элемент в файл XML так, чтобы он записался в сам XML-файл?

Добавить элемент в XML
Есть таблица, которая имеет поле с типом XML. XML имеет следующий вид: &lt;root&gt; &lt;Personals&gt; &lt;Person&gt; &lt;FIO&gt;?.?....

Добавить node в элемент (XML)
Имеется следующая структура xml: &lt;Test&gt; &lt;Question id=&quot;1&quot; Type=&quot;1&quot;&gt; &lt;Text&gt;Ваше имя?&lt;/Text&gt; &lt;Answer id=&quot;1&quot;...

Linq и xml (добавить элемент)
Здравствуйте, помогите пожалуйста люди добрые. Имеется xml файл со следующим ветвением: &lt;root&gt; &lt;car...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №4)
Maks 15.11.2026
Что-то я перемудрил с предыдущими версиями, в этот раз сделал всё проще, обратившись к функции "СтрокаЛатиницей" из типового общего модуля "СтроковыеФункцииКлиент". В данной функции нет апострофов,. . .
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru