Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Получение имени вложенного тега в xml


Автор: Grelloo 24.6.2006, 13:11
Есть 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);


Надо получить имя второго тега, зная имя первого
 

Автор: LSD 24.6.2006, 14:01
Код
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());  
}
 

Автор: Grelloo 24.6.2006, 14:57
В стоке 
Цитата(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
 

Автор: LSD 24.6.2006, 15:11
Убери кастинг:
Код
Node T2 = childNodes.item(i);


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

Автор: Grelloo 24.6.2006, 16:13
1.5.06 

Автор: LSD 24.6.2006, 17:11
Цитата(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. 

Автор: Grelloo 25.6.2006, 21:38
Поэксперементировал, получил следующее:
Вот в таком 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>

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

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

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

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

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

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

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

Автор: Grelloo 26.6.2006, 11:01
Я не могу найти как установить 
ignore whitespaces
В DocumentBuilderFactory есть метод setIgnoringElementContentWhitespace, но он не работает 

Автор: batigoal 26.6.2006, 12:53
Хм, вроде у меня работал, но точно не вспомню.

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

Автор: Grelloo 26.6.2006, 13:42
Получается, что каждый узел надо проверять текстовый он или нет. Не дело это. Может есть другие варианты? 

Автор: LSD 27.6.2006, 22:50
Цитата(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) является обязательным.
 

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

А почему? 

Автор: LSD 28.6.2006, 22:12
Цитата(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.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)