Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение имени вложенного тега в xml 
:(
    Опции темы
Grelloo
Дата 24.6.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Есть xml-файл
Код

<root>
  <T1>
    <T2>Value</T2>
  </T1>
</root>

Значение второго тега получаю следующим образом:

Код

        //tagsDoc - документ полученный из данного xml-файла
        Element tagsRoot = tagsDoc.getDocumentElement();
        NodeList tags = tagsRoot.getElementsByTagName("T1");
        Element T1 = (Element)tags.item(0);
        
              String T2 = T1.getElementsByTagName("T2")
              .item(0)
              .getFirstChild().getNodeValue();
              System.out.println("T2: " + T2);


Надо получить имя второго тега, зная имя первого
 
PM MAIL ICQ   Вверх
LSD
Дата 24.6.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document tagsDoc = docBuilder.parse(new InputSource(new StringReader("<root><T1><T2>Value</T2></T1></root>")));
NodeList tags = tagsDoc.getElementsByTagName("T1");
Element T1 = (Element) tags.item(0);

NodeList childNodes = T1.getChildNodes();
for(int i=0; i < childNodes.getLength(); i++)
{
  Element T2 = (Element) childNodes.item(i);
  System.out.println(T2.getNodeName());  
}
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Grelloo
Дата 24.6.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



В стоке 
Цитата(LSD @  24.6.2006,  14:01 Найти цитируемый пост)
  Element T2 = (Element) childNodes.item(i);

Выдает  исключение
Код

Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTextImpl
 
PM MAIL ICQ   Вверх
LSD
Дата 24.6.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Убери кастинг:
Код
Node T2 = childNodes.item(i);


P.S. Какая у тебя Java? 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Grelloo
Дата 24.6.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



1.5.06 
PM MAIL ICQ   Вверх
LSD
Дата 24.6.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Grelloo @  24.6.2006,  17:13 Найти цитируемый пост)
1.5.06

Ну тогда вообще не понимаю, откуда ошибки. Я запускаю на 1.5.0_1.

Добавлено @ 17:16 
Тем более что класс com.sun.org.apache.xerces.internal.dom.DeferredTextImpl реализует org.w3c.dom.Element. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Grelloo
Дата 25.6.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Поэксперементировал, получил следующее:
Вот в таком xml можно получить T2
Код

<?xml version="1.0" encoding="UTF-8"?>
<root>
<T1><T2>Value</T2></T1>
</root>


А в таком нет
Код

<?xml version="1.0" encoding="UTF-8"?>
<root>
<T1>
<T2>Value</T2>
</T1>
</root>

Получается парсер не переваривает симолы переноса строки? 
PM MAIL ICQ   Вверх
batigoal
Дата 26.6.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Grelloo @  25.6.2006,  22:38 Найти цитируемый пост)

Получается парсер не переваривает симолы переноса строки?  

нет, просто ты не свосем корректно парсишь. Перенос строки - это тоже текст, поэтому он воспринимает
Код

<root>
<T1>
<T2>Value</T2>
</T1>

как узел + текст (перенос строки) + вложенный узел.

В свойствах парсера можно установить ignore whitespaces. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Grelloo
Дата 26.6.2006, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Я не могу найти как установить 
ignore whitespaces
В DocumentBuilderFactory есть метод setIgnoringElementContentWhitespace, но он не работает 
PM MAIL ICQ   Вверх
batigoal
Дата 26.6.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Хм, вроде у меня работал, но точно не вспомню.

Тогда подправь немного код, чтобы пропускать узел, если он текстовый. 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Grelloo
Дата 26.6.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 18.3.2006
Где: г. Екатеринбург

Репутация: нет
Всего: нет



Получается, что каждый узел надо проверять текстовый он или нет. Не дело это. Может есть другие варианты? 
PM MAIL ICQ   Вверх
LSD
Дата 27.6.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Grelloo @  26.6.2006,  14:42 Найти цитируемый пост)
Получается, что каждый узел надо проверять текстовый он или нет. Не дело это.

Именно так и надо. Такова спецификация DOM. Тем более что в ситуации:
Код
<root>
  <T1>
    bla-bla-bla
    <T2>Value</T2>
    bla-bla-bla
  </T1>
</root>

эти ноды в любом случае будут существовать.

А вообще это включается так:
Код
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);

обрати внимание, что setValidating(true) является обязательным.
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 28.6.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(LSD @  27.6.2006,  23:50 Найти цитируемый пост)
обрати внимание, что setValidating(true) является обязательным.

А почему? 


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 28.6.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Lamer George @  28.6.2006,  09:17 Найти цитируемый пост)
А почему?

Не знаю, но так написано в JavaDoc к методу setIgnoringElementContentWhitespace():
Цитата
Due to reliance on the content model this setting requires the parser to be in validating mode.
 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.