Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

XML Element - как получить содержание по уровням?

107 views
Skip to first unread message

Андрей Y

unread,
Nov 17, 2006, 4:51:11 AM11/17/06
to
Имеется org.w3c.dom.Element Хочу получить
содержащиеся в нем елементы, но только первого
уровня. Т.е. детей, но не внуков. Так просто не
получается. Оператор
element.getElementsByTagName("*"); выдает,
естественно, весь список:( Т.е. чтобы уловить,
например, разницу между <tag1/><tag2/> и
<tag1><tag2/></tag1> приходися писать кучу
наворотов. Чувствую, что чего-то не знаю или не
понимаю. Задача-то, похоже, весьма обычная.
Подскажите, пожалуйста:
1) Как просто получить только элементы первого
уровня вложенности?
2) Как просто узнать сколько уровней вложенности
содержит данный елемент?
--
.......................................................
Если надумаете е-мылить - лучше
andreyz2000#hotmail com

Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Ansis Svaza

unread,
Nov 17, 2006, 6:43:47 AM11/17/06
to
Hello Андрей!

17 Nov 06 12:51, Андрей Y wrote to All:

АY> Имеется org.w3c.dom.Element Хочу получить
Посмотри в сторону библиотеки JDom (www.jdom.org). Там API намного проще
стандартного.
Ansis

Peter B. Shalimoff

unread,
Nov 18, 2006, 9:16:13 AM11/18/06
to
Андрей Y wrote:
> Имеется org.w3c.dom.Element

> 1) Как просто получить только элементы первого уровня вложенности?

Руками выковыривать из element.getChildNodes(). Или с помощью XPath:

import javax.xml.xpath.*;
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList)xpath.evaluate("*", element, XPathConstants.NODESET);

> 2) Как просто узнать сколько уровней вложенности содержит данный
> елемент?

Руками.

--
0xdeadbeef

DeNik Sitnitsa

unread,
Nov 19, 2006, 8:47:28 AM11/19/06
to
hi Peter

>> 2) Как просто узнать сколько уровней вложенности содержит данный
>> елемент?

PS> Руками.

отличный ответ для ru.java.CHAINIK

bye

Peter B. Shalimoff

unread,
Nov 19, 2006, 10:55:43 AM11/19/06
to
DeNik Sitnitsa wrote:
> отличный ответ для ru.java.CHAINIK

Не знал, что chainik - синоним brain-damaged. Алгоритмы обхода деревьев
можно узнать в ru.algorithms, к яве-то это каким боком?

--
0xdeadbeef

DeNik Sitnitsa

unread,
Nov 19, 2006, 2:56:30 PM11/19/06
to
hi Peter

>> отличный ответ для ru.java.CHAINIK
PS> Hе знал, что chainik - синоним brain-damaged. Алгоритмы обхода
PS> деревьев можно узнать в ru.algorithms, к яве-то это каким боком?

я понимаю что выебываться когда все знаешь = молодец, но люди здесь спрашивают
то, что они не знают, и твой ответ про то, как надо исправлять кривые руки им в
хуй не впился, т.к. им нужна тупо помощь. это так, примерно. это
ru.java.CHAINIK.

bye

Peter B. Shalimoff

unread,
Nov 19, 2006, 4:56:20 PM11/19/06
to
DeNik Sitnitsa wrote:
> я понимаю что выебываться когда все знаешь = молодец, но люди здесь
> спрашивают то, что они не знают, и твой ответ про то, как надо
> исправлять кривые руки им в хуй не впился, т.к. им нужна тупо помощь.
> это так, примерно. это ru.java.CHAINIK.

Выебываешься пока что только ты. Как получить детей элемента было
объяснено в ответе на первый вопрос. Для особо одаренных могу повторить
- element.getChildNodes(). Просто "руками" значит то же самое, что и
"руками выковыривать", т.е. "нет стандартных/готовых средств". Свою
больную фантазию, нарисовавшую исправление кривых рук, лечить надо у
психиатра, пока ее не вылечил кто-нибудь другой менее гуманным способом.
Это так, дружеский совет.

--
0xdeadbeef

Sergey Kaluzhskiy

unread,
Nov 19, 2006, 11:48:58 PM11/19/06
to
Привет, Андрей!

fri, 17 November 2006 12:51, Андрей Y wrote to All:

АY> Имеется org.w3c.dom.Element Хочу получить

АY> содержащиеся в нем елементы, но только первого
АY> уровня. Т.е. детей, но не внуков. Так просто не
АY> получается.

[...]

АY> Подскажите, пожалуйста:
АY> 1) Как просто получить только элементы первого
АY> уровня вложенности?


Как открыть хмл и пройтись по всем элементам, дочерним к корневому:


import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

...

System.out.print("Opening XML file...");
File xmlFile = new File("blablabla.xml");
if(!xmlFile.exists()) {
System.out.println("\nError: File not found.");
return;
}
try {
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlFile);
//obtaining root node
rootNode = document.getDocumentElement();
} catch (Exception ex) {
System.out.println("\nError: " + ex.toString());
ex.printStackTrace();
return;
}
System.out.print("OK\nObtaining children list...");
NodeList childrenList = rootNode.getElementsByTagName("childName");
int childrenAmount = childrenList.getLength();
System.out.println(childrenAmount + " found");
Element child;
for(int i=0; i<childrenAmount; ++i) {
child = (Element)childrenList.item(i);
/* Здесь творим все что необходимо с дочерним узлом, можно например
точно так же выцепить через getElementByTagName() его дочерние узлы и пройтись
по ним */

}
}


АY> 2) Как просто узнать сколько уровней вложенности
АY> содержит данный елемент?

Спустившись по дереву до этого элемента и считая уровни вложенности.


Sergey.

Now playing: Infected Mushroom - Live @ DNA Lounge (9/14/02)

DeNik Sitnitsa

unread,
Nov 20, 2006, 2:10:30 PM11/20/06
to
hi Peter

>> я понимаю что выебываться когда все знаешь = молодец, но люди здесь
>> спрашивают то, что они не знают, и твой ответ про то, как надо
>> исправлять кривые руки им в хуй не впился, т.к. им нужна тупо
>> помощь. это так, примерно. это ru.java.CHAINIK.

PS> Выебываешься пока что только ты.

я не выебываюсь, я бешусь. точнее бесился.

PS> Как получить детей элемента было
PS> объяснено в ответе на первый вопрос. Для особо одаренных могу
PS> повторить - element.getChildNodes(). Просто "руками" значит то же
PS> самое, что и "руками выковыривать", т.е. "нет стандартных/готовых
PS> средств". Свою больную фантазию, нарисовавшую исправление кривых рук,
PS> лечить надо у психиатра, пока ее не вылечил кто-нибудь другой менее
PS> гуманным способом. Это так, дружеский совет.

я к тому, что если человек пишет, то он не знает как это сделать. для того,
чтобы правильные мысли начали появлятся в голове, надо пару раз тыркнуть
пальцем как и что примерно делать. а сообщения типа "RTFM" не дают абсолютно
ничего.

bye

Андрей Y

unread,
Nov 21, 2006, 3:38:34 AM11/21/06
to
Уважаемые! Не надо, наверное, так интенсивно
ссориться!
Шекспир в том, что руками-то каждый может, а вот
женщину найти...
Вопрос заключался не в том, как выбрать нужные
элементы руками (криво или прямо, но сделать это
не сложно), а как это делается имеющимися в
пакетах средствами (очень уж стандартная задача).
На мой чайниковский взгляд, на то и пишется
разными людьми множество пакетов, чтобы каждый не
писал заново одну и ту же процедуру. Проблема в
том, что тупой поиск в сети дает кучу мусора и
разобраться в том что рабочее, что мусорное, а что
недоделанное - без совета невозможно (ну или,
точнее, оборачивается немерянной бессмысленной
работой).

Теперь по делу. Из данной дискуссии стало понятно,
что в стандартном пакете таких средств нету:(
Хорошие люди посоветовали обратоиться к другим
пакетам. Первым (по почте почему-то) пришел ответ
> Используй dom4j (http://www.dom4j.org) -
> ИМХО лучшая библиотека для работы с xml.
его и попробовал. Все работает. Хелп правда
слабый, но разобраться удалось. За что и спасибо.
Вроде работает нормально.

ЗЫ: ИМХО Ответ RFM права ма жизнь не имеет. Просто
показывает, что у отвечающего времени немеряно -
бессмысленные посты в форумы гнать. В вот Read
такой-то FManual, тему такую-то - уже помощь
(если, конечно, тема не на 150 страниц).

Sergey Kaluzhskiy

unread,
Nov 21, 2006, 11:52:51 AM11/21/06
to
Привет, DeNik!

mon, 20 November 2006 22:10, DeNik Sitnitsa wrote to Peter B. Shalimoff:

DS> я к тому, что если человек пишет, то он не знает как это сделать. для
DS> того, чтобы правильные мысли начали появлятся в голове, надо пару раз
DS> тыркнуть пальцем как и что примерно делать. а сообщения типа "RTFM" не
DS> дают абсолютно ничего.

Ошибаешься. Почитай http://skipy.dev.juga.ru/philosophy/learning.html

Приведу здесь фрагмент, показывающий основную мысль:


+--------------_ Hу что же, давайте заслушаем *Windows Clipboard* _------
Ситуация подобна трясине. Чем больше мы спрашиваем, тем больше привыкаем к
этому. Чем больше привыкаем, тем больше спрашиваем. Замкнутый круг. И сколько
же времени будем спрашивать? Год? Два?.. Десять... А в 40 лет остается только
жаловаться. С молодыми тягаться трудно... Жизнь не сложилась...

Что же получается? А получается, что любимая многими практика задавать вопросы
- она выигрышна только в очень ближней перспективе. Сэкономили немного времени.
А что было бы, если бы попытались искать самостоятельно?

Кажущийся минус - это отняло бы больше времени. Hо вот отняло ли? Я бы сказал -
заняло. Ибо за время поиска, во-первых, вы получите гарантированно больше
информации, нежели задав вопрос "гуру". Просто потому, что до того момента, как
вы найдете то, что вам нужно, вам придется прочитать много другого, не
относящегося к проблеме напрямую. А, во-вторых, докопавшись, наконец, вы скорее
всего найдете именно общий принцип. Знание которого и делает "гуру" - "гуру". И
это - существенный плюс. Ибо в следующей сходной ситуации вы уже не будете
тратить время на поиск решения. Более того, знание принципов дает возможность
успешно применять их в совсем других областях. Это то, что называется
"фундаментальность подхода".
+--------------_ И на этом речь *Windows Clipboard* заканчивается _------

Sergey.

Now playing: Theatre Of Tragedy - Cassandra

DeNik Sitnitsa

unread,
Nov 21, 2006, 2:56:02 PM11/21/06
to
hi Sergey


DS>> я к тому, что если человек пишет, то он не знает как это сделать.

DS>> для того, чтобы правильные мысли начали появлятся в голове, надо
DS>> пару раз тыркнуть пальцем как и что примерно делать. а сообщения
DS>> типа "RTFM" не дают абсолютно ничего.
SK> Ошибаешься. Почитай http://skipy.dev.juga.ru/philosophy/learning.html
SK> Приведу здесь фрагмент, показывающий основную мысль:
SK> +--------------_ Hу что же, давайте заслушаем *Windows Clipboard*
SK> _------ Ситуация подобна трясине. Чем больше мы спрашиваем, тем больше
SK> привыкаем к этому. Чем больше привыкаем, тем больше спрашиваем.
SK> Замкнутый круг. И сколько же времени будем спрашивать? Год? Два?..
SK> Десять... А в 40 лет остается только жаловаться. С молодыми тягаться
SK> трудно... Жизнь не сложилась...

SK> Что же получается? А получается, что любимая многими практика задавать
SK> вопросы - она выигрышна только в очень ближней перспективе. Сэкономили
SK> немного времени. А что было бы, если бы попытались искать
SK> самостоятельно?

SK> Кажущийся минус - это отняло бы больше времени. Hо вот отняло ли? Я бы
SK> сказал - заняло. Ибо за время поиска, во-первых, вы получите
SK> гарантированно больше информации, нежели задав вопрос "гуру". Просто
SK> потому, что до того момента, как вы найдете то, что вам нужно, вам
SK> придется прочитать много другого, не относящегося к проблеме напрямую.
SK> А, во-вторых, докопавшись, наконец, вы скорее всего найдете именно
SK> общий принцип. Знание которого и делает "гуру" - "гуру". И это -
SK> существенный плюс. Ибо в следующей сходной ситуации вы уже не
SK> будете тратить время на поиск решения. Более того, знание принципов
SK> дает возможность успешно применять их в совсем других областях. Это
SK> то, что называется "фундаментальность подхода". +--------------_ И на
SK> этом речь *Windows Clipboard* заканчивается _------

тогда зачем нужна эта эха?

bye

Vadim Voituk

unread,
Nov 22, 2006, 4:35:19 AM11/22/06
to

Чтоб доносить до таких как ты вышеуказанные мысли.

--
Vadim Voituk
http://asg.kiev.ua/voituk/

Андрей Y

unread,
Nov 22, 2006, 9:44:23 AM11/22/06
to
>>> Ошибаешься. Почитай
http://skipy.dev.juga.ru/philosophy/learning.html

>> тогда зачем нужна эта эха?
> Чтоб доносить до таких как ты вышеуказанные мысли.

1) Даже странно. Мой, еще и не самый глупый
вобщем-то, вопрос такую драку вызвал:)

2) Я вот прочитал эту статью и удивился. В первую
очередь тому, что кто-то такие статьи всерез
принимает, да еще и цитирует:) Противиречие в
первм же абзаце ("Один в 40 лет стоит во главе
преуспевающей компании, а другой в те же 40 лет
остается простым разработчиком" - для мало
думающих поясню, что руководитель компании и
программист две совершенно разные области
деятельности и, как Яву ни изучай, ни бизнесменом,
ни менеджером не станешь:). Ну и так далее. Судя
по всему Ява-гуру вдруг стал считать себя гуру
педагогики. Через пару лет он будет, наверное,
обяснять как удалять аппендициты:).

3) Для тех, кто с педагогикой не знаком, поясняю
(хоть я и не гуру в этой области, но пару-тройку
экзаменов сдал): одному и тому же можно научиться
разными способами и задавание вопросов - один из
весьма эффективных. Вопрос в том какие выводы
делает обучаемый из ответа: просто применяет
готовое решение или обобщает и переваривает. Форум
- не класс; отвечающий обычно не знает как
использовали его ответ, но это не причина считать
окружающих ничего не понимающими попугаями.

4) Еще одна ошибка - считать что цель любого
программирующего - стать Ява-гуру. Я вот вряд-ли
стану. Хотелось бы, но времени скорее всего не
хватит. Я не программист, а специалист
использующий в своей работе программирование.
Причем языки приходится выбирать под задачу. На
яве писал с пол-года 7 лет назад. С тех пор были
другие проблемы и другие языки. А вот сейчас опять
Ява - вспоминаю почти с нуля. Может еше только
пару месяцев с ней, а может и пару лет - не знаю.

5) Вопрос. Помогите нам-чайникам определиться.
Ходить сюда или нет? Нарываться на ответ RFM
вряд-ли кому интересно. И ответ этот уж точно
никого ничему не научит.


--

Peter B. Shalimoff

unread,
Nov 22, 2006, 12:31:13 PM11/22/06
to
Андрей Y wrote:
> 1) Даже странно. Мой, еще и не самый глупый вобщем-то, вопрос такую
> драку вызвал:)

Предлагаю весной-осенью сходить в ru.os.cmp и посмотреть на настоящие
драки. :)

> 2) Я вот прочитал эту статью и удивился. В первую очередь тому, что
> кто-то такие статьи всерез принимает, да еще и цитирует:) Противиречие
> в первм же абзаце ("Один в 40 лет стоит во главе преуспевающей
> компании, а другой в те же 40 лет остается простым разработчиком" -
> для мало думающих поясню, что руководитель компании и программист две
> совершенно разные области деятельности и, как Яву ни изучай, ни
> бизнесменом, ни менеджером не станешь:).

Речь (в цитате, статью не читал) о том, что один вырос, а другой нет.
Области разные, но в обеих есть возможность роста. Можно стать не
простым разрабом, а архитектором, например. Не буду язвить на тему "мало
думающих", уверен, сам всё понимаешь.

> 5) Вопрос. Помогите нам-чайникам определиться.
> Ходить сюда или нет?

Каждый решает сам. Как вариант - ходить до тех пор, пока от эхи есть
польза. :) Тут как минимум можно понять (если вдруг еще не), что
способов что-то сделать может быть целая куча, и через это научиться
правильно задавать вопросы. Например, не просто "как сделать?", а "как
сделать, кроме как руками/тем-этим/пятым-десятым?" Потому что, когда у
человека перед носом лежит javadoc про org.w3c.dom.Element с надписью
"Methods inherited from interface org.w3c.dom.Node", а он спрашивает
"как сделать?", то ответ тут один: RTFM. Ну там не заметил или еще что.

Другое дело, что ответы можно получить на совсем другие вопросы.
Например, мой настоящий ответ на вопрос про максимальный уровень
вложенности детей - сменить дизайн. :) Но эха вроде как про яву, поэтому
ответил про нее.

> Нарываться на ответ RFM вряд-ли кому интересно. И ответ этот уж точно
> никого ничему не научит.

Этот ответ заставляет вспомнить и применить очень полезный навык,
полученный в универе/школе, а то и раньше - самостоятельно работать с
информацией, начиная с ее добычи. Одна только добыча заставляет мозги
работать, не говоря уже про обработку и применение.

--
0xdeadbeef

DeNik Sitnitsa

unread,
Nov 22, 2006, 11:53:06 AM11/22/06
to
hi Vadim


VV> From: Vadim Voituk <ne...@asg.kiev.ua>

>> тогда зачем нужна эта эха?

VV> Чтоб доносить до таких как ты вышеуказанные мысли.

класс. спасибо. это была действительно отличная мысль.

bye

Sergey Kaluzhskiy

unread,
Nov 21, 2006, 11:28:48 PM11/21/06
to
Привет, DeNik!

tue, 21 November 2006 22:56, DeNik Sitnitsa wrote to Sergey Kaluzhskiy:

[...]

SK>> Ибо в следующей
SK>> сходной ситуации вы уже не будете тратить время на поиск решения.
SK>> Более того, знание принципов дает возможность успешно применять
SK>> их в совсем других областях. Это то, что называется
SK>> "фундаментальность подхода". +--------------_ И на этом речь
SK>> *Windows Clipboard* заканчивается _------

DS> тогда зачем нужна эта эха?

Чтобы _подсказать_ путь поиска правильного решения. И как раз тот вариант что
помог Андрею, это подтверждает:

> Используй dom4j (http://www.dom4j.org) -
> ИМХО лучшая библиотека для работы с xml.

Ему не дали готового решения на блюдечке, а подсказали, в какую сторону копать.
И, мне кажется, такая подсказка наиболее полезна для спрашивающего.

Sergey.

Now playing: Hive - Ultrasonic Sound

Roman Dawydkin

unread,
Nov 23, 2006, 1:17:44 AM11/23/06
to
[Tue 21-Nov-2006 11:38] Андрей Y ==> All

АY> Вопрос заключался не в том, как выбрать нужные
АY> элементы руками (криво или прямо, но сделать это
АY> не сложно), а как это делается имеющимися в
АY> пакетах средствами (очень уж стандартная задача).
АY> Hа мой чайниковский взгляд, на то и пишется
АY> разными людьми множество пакетов, чтобы каждый не
АY> писал заново одну и ту же процедуру. Проблема в
АY> том, что тупой поиск в сети дает кучу мусора и
АY> разобраться в том что рабочее, что мусорное, а что
АY> недоделанное - без совета невозможно (ну или,
АY> точнее, оборачивается немерянной бессмысленной
АY> работой).

<стёб>
Задача - нужно решить квадратное уравнение. А как это делается имеющимися в
пакетах средствами (очень уж стандартная задача)? Какой-то беспорядок
получается - множество людей пишет заново одну и ту же процедуру решения
квадратного уравнения. Проблема в том, что тупой поиск в сети дает кучу мусора


и разобраться в том что рабочее, что мусорное, а что недоделанное - без совета
невозможно (ну или, точнее, оборачивается немерянной бессмысленной работой).

</стёб>

По делу: гражданин, ваша задачка - на один цикл, и чем искать что-то
готовое, быстрее самому написать, и не нужны никакие навороты.
А то "готовое", что вам могут предложить - не всегда вам может подойти.

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class ElementIterator implements Iterator<Element>, Iterable<Element>
{
private final String tagName;
private Node current;
private Node found;

public ElementIterator(Node parent, String tagName) {
this.tagName = tagName;
current = parent.getFirstChild();
}

public boolean hasNext() {
if (found != null) {
return true;
}
while (current != null) {
if (current.getNodeType() == Node.ELEMENT_NODE) {
final Element element = (Element) current;
if (tagName.equals(element.getTagName())) {
found = current;
return true;
}
}
current = current.getNextSibling();
}
return false;
}

public Element next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
final Element result = (Element) current;
current = current.getNextSibling();
found = null;
return result;
}

public void remove() {
throw new UnsupportedOperationException();
}

public Iterator<Element> iterator() {
return this;
}
}

использование:
.......
for (final Element element : new ElementIterator(parentNode, "my")) {
обрабатываем(element);
}

... mail/jabber: tanmatra{at}gmail{dot}com, ICQ# 223012120

0 new messages