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

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

25.09.2013, 02:35. Показов 3896. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru