Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Работа с библиотекой Dom4j / 14 сообщений из 14, страница 1 из 1
20.01.2013, 15:22:46
    #38116863
alexey94
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
Здравствуйте. Есть xml-файл с такой структурой:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<first>
    <second>
         <third>
                one, two, three
         </third>
         <third>
                four, five, six
         </third>
    </second>
    <second>
          <third>
                seven, eight, nine
          </third>
          <third>
                one, eight, two
          </third>
    </second>
</first>



В зависимости от содержимого элемента <third>, нужно вывести всё содержимое <second>, в т.ч. и вложенные элементы. Т.е. если переменная String abc="one", то "one" разыскивается в тегах <third> и где найдена, там выводится всё содержимое тега <second> вместе с дочерними элементами.
Вытащить из xml-ля содержимое одного тега можно таким образом NodeList children = element.getElementsByTagName("third"), но как узнать какой именно тег <third> нужно взять, в зависимости от его содержимого и как вытащить вместе с ним и родительский элемент, есть ли для этого стандартный метод в dom4j ?
...
Рейтинг: 0 / 0
20.01.2013, 22:10:52
    #38117115
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
Метод получения родительского элемента сложно не найти
http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/Node.html#getParent%28%29
Сам вопрос не очень понял. Либо используйте xpath для сложного поиска. Либо перебирайте ноды, анализируйте содержимое.
...
Рейтинг: 0 / 0
20.01.2013, 23:19:24
    #38117165
alexey94
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
BlazkowiczСам вопрос не очень понял.
Ну, суть в том, что программа анализирует содержимое тега <third> на наличие какого-то слова, если находит, например, слово "five", то выводит на экран всю ветку, включая родительский элемент
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
    
<second>
         <third>
                one, two, three
         </third>
         <third>
                four, five, six
         </third>
</second>
...
Рейтинг: 0 / 0
20.01.2013, 23:47:12
    #38117189
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
И в чем конкретно проблема?
...
Рейтинг: 0 / 0
21.01.2013, 00:10:54
    #38117205
alexey94
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
BlazkowiczИ в чем конкретно проблема?
В общем, я нахожу слово "five", теперь мне нужно вывести элемент, в котором я его нашел и его родительский элемент, вот так
Код: xml
1.
2.
3.
4.
5.
6.
7.
<first>
    <second>
         <third>
                four, five, six
         </third>
    </second>
</first>


Проблема в том, что я не знаю, как найдя слово "five", потом подобраться к тегу <third>, в котором оно содержится и вывести именно тот тег <third>, в содержимом которого есть слово "five" и его родительский элемент <second>, а не просто все теги <third>, которые есть в документе xml.
...
Рейтинг: 0 / 0
21.01.2013, 00:27:20
    #38117214
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
Посмотри как в XPath можно получить родителя.

http://www.w3schools.com/xpath/xpath_axes.asp
...
Рейтинг: 0 / 0
21.01.2013, 11:08:28
    #38117532
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
alexey94Проблема в том, что я не знаю, как найдя слово "five", потом подобраться к тегу <third>, в котором оно содержится и вывести именно тот тег <third>, в содержимом которого есть слово "five" и его родительский элемент <second>, а не просто все теги <third>, которые есть в документе xml.
В чем сложность. Перебором находим элемент, у которого нет дочерних элеметов. Читаем его textContent. Если в textContent имеется искомое слово и это "third". То это наш элемент. Это так трудно запрограммировать?
...
Рейтинг: 0 / 0
21.01.2013, 11:09:14
    #38117535
alexander00513
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
dom4j - это требование ? Если нет - можно попробовать использовать Jaxb, представив ноды xml в виде объектов, а дальше циклом перебирать их...
...
Рейтинг: 0 / 0
21.01.2013, 13:45:26
    #38117978
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
alexander00513dom4j - это требование ? Если нет - можно попробовать использовать Jaxb, представив ноды xml в виде объектов, а дальше циклом перебирать их...
Цикл хорош только в простейших случаях. Если автору нужно оглядываться назад на несколько тегов
или наоборот смотреть вперёд то решение с циклом будет весьма сложно и чревато ошибками.
...
Рейтинг: 0 / 0
21.01.2013, 13:58:00
    #38118006
alexander00513
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
Согласен..
...
Рейтинг: 0 / 0
21.01.2013, 20:00:16
    #38118683
alexey94
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
Blazkowiczalexey94Проблема в том, что я не знаю, как найдя слово "five", потом подобраться к тегу <third>, в котором оно содержится и вывести именно тот тег <third>, в содержимом которого есть слово "five" и его родительский элемент <second>, а не просто все теги <third>, которые есть в документе xml.
В чем сложность. Перебором находим элемент, у которого нет дочерних элеметов. Читаем его textContent. Если в textContent имеется искомое слово и это "third". То это наш элемент. Это так трудно запрограммировать?
Спасибо, попробую так сделать. Запрограммировать то не сложно, а вот додуматься да
...
Рейтинг: 0 / 0
22.01.2013, 14:56:30
    #38119767
alexey94
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
Я сделал вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class JavaApplication3 {

        public static void main(String[] args) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(new File("f.xml"));
        String a = "one";
        List list = XPath.selectNodes(doc, ".//second/third"); //без переменной
        System.out.println(list);
    }
}


Он выводит четыре пустых закрытых тега
Код: xml
1.
[[Element: <third/>], [Element: <third/>], [Element: <third/>], [Element: <third/>]]



А когда сделал вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class JavaApplication3 {

        public static void main(String[] args) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(new File("f.xml"));
        String a = "one";
        List list = XPath.selectNodes(doc, "//second/third/text()='"+a+"'"); // подставил переменную
        System.out.println(list);
    }
}


Выводит
Код: xml
1.
[false]



А как сделать так, чтобы он выводит текст вместе с тегами, хотя бы с теми, в которые этот текст заключен?
...
Рейтинг: 0 / 0
22.01.2013, 15:21:08
    #38119821
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
В дебаге посмотрите. Элементы List это Node. У Node можно вызвать соответствующие методы и получить содержимой.
...
Рейтинг: 0 / 0
22.01.2013, 15:34:42
    #38119848
alexey94
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с библиотекой Dom4j
Blazkowicz,

Сейчас уже вот так написал
Код: java
1.
List list = XPath.selectNodes(doc, ".//second/third/child::text()");


Теперь выводит текстовое наполнение тега <third>, буду дальше разбираться
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Работа с библиотекой Dom4j / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]