С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
1

Парсинг XML + построение дерева данных

31.03.2015, 12:01. Показов 3713. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, форумчате!
В общем, передо мной стоит такая задача:
Нужно парсить несколько XML файлов и полученные данные вывести в единое дерево.
Подскажите, каким образом это можно реализовать и где копать?

Добавлено через 10 минут
XML выглядят примерно так:
XML
1
2
3
4
5
6
7
<?xml version="1.0"?>
<AppXml  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Имя</Name>
  <Number>2</Number>
  <AnalyseDate>2009-01-18T12:12:16</AnalyseDate>
  <Revision>1</Revision>
  <User />
Но при этом количество файлов, которые нужно парсить может быть различным, в зависимости от случая.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.03.2015, 12:01
Ответы с готовыми решениями:

Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML
Всем доброго времени суток. Тема является продолжением вот этой темы. Создаю 2ю, так как там...

Парсинг файлов формата IFC и построение дерева TreeView на основе полученных данных
Всем здрасти! У меня ужасное положение. Мне нужно сдавать проект. Проект парсит файлы формата IFC и...

Построение дерева TreeView из XML
Здравствуйте! Уважаемые, подскажите пожалуйста как из такого XML-файла построить дерево в TreeView...

Операции над бинарными деревьями: построение дерева, обход дерева, вставка и удаление элемента дерева
Пожалуйста кто сможет, помогите составить программу: Организация по трудоустройству населения...

12
23 / 23 / 12
Регистрация: 25.03.2015
Сообщений: 98
31.03.2015, 12:07 2
JAXB
1
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
02.04.2015, 10:22  [ТС] 3
Спасибо, потихоньку разбираюсь. Но возникла проблема.
Если теги в XML написаны с большой буквы, то данные не выводятся.

Добавлено через 18 часов 40 минут
Разобрался немного лучше. Сначала необходимо на основе xml построить схему xsd. Далее с помощью утилиты xjc сгенерировать модели классов. Ну и Unmarshaling.
0
18 / 18 / 12
Регистрация: 27.03.2015
Сообщений: 72
02.04.2015, 10:44 4
А стандартные пакеты javax.xml.*, org.w3c.org.* чем хуже?
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
02.04.2015, 10:58 5
Java
1
2
@XmlElement(name = "Name")
protected String name;
Добавлено через 2 минуты
Цитата Сообщение от BazZile Посмотреть сообщение
Сначала необходимо на основе xml построить схему xsd. Далее с помощью утилиты xjc сгенерировать модели классов.
Если xsd надо составлять самому, а не откуда-нибудь из вне брать, то пиши классы сам. Не усложняй...

Цитата Сообщение от javafx Посмотреть сообщение
А стандартные пакеты javax.xml.*, org.w3c.org.* чем хуже?
Руками парсинг описывать надо.
1
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
02.04.2015, 11:07  [ТС] 6
На самом деле есть определенная xsd. Просто изначально был только xml-файл..

Добавлено через 3 минуты
Остался только вопрос, как теперь полученные данные поместить в дерево?
0
4866 / 2664 / 914
Регистрация: 29.11.2010
Сообщений: 5,746
02.04.2015, 22:00 7
Ваш исходный XML некорректный.

Попробуйте пакет fasterxml -- jackson-jaxrs-xml-provider (вместе с jackson-databind)

javax.xml.bind.annotations.* поддерживаются.

Если бы вы привели правильный формат исходного XML и root для конечного файла, можно было бы привести пример гораздо конкретнее.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
 
class App {
    private final String name;
    private final String number;
    private final String analyseDate;
    private final String revision;
    private final String user;
 
    public App() {
        this("", "", "", "", "");
    }
 
    App(String name, String number, String analyseDate, String revision, String user) {
        this.name = name;
        this.number = number;
        this.analyseDate = analyseDate;
        this.revision = revision;
        this.user = user;
    }
 
    public String getName() {
        return name;
    }
 
    public String getNumber() {
        return number;
    }
 
    public String getAnalyseDate() {
        return analyseDate;
    }
 
    public String getRevision() {
        return revision;
    }
 
    public String getUser() {
        return user;
    }
}
 
public class Test {
    public static void main(String[] args) throws IOException {
        final List<String> files = Arrays.asList("a.xml", "b.xml");
        final ObjectMapper mapper = new XmlMapper();
        final List<App> apps = new ArrayList<>();
        for (final String file : files) {
            final App app = mapper.readValue(new File(""), App.class);
            apps.add(app);
        }
        final String xml = mapper.writeValueAsString(Arrays.asList(new App()));
        System.out.println(xml);
    }
}
1
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
03.04.2015, 08:30  [ТС] 8
lemegeton, спасибо! Просто исходная XML очень большая.
А каким образом можно реализовать, если на входе есть несколько xml-файлов (причем могут быть различного содержания), и необходимо выдергивать оттуда все данные.
Возможно ли в процессе работы программы генерировать модель классов на основе xml-ки?
0
4866 / 2664 / 914
Регистрация: 29.11.2010
Сообщений: 5,746
03.04.2015, 13:45 9
Сформулируйте, пожалуйста, задачу более полно. Слишком много информации допускающей разночтение. Например, изначально не было условия, что исходные файлы могут быть различного содержания.


Я так понимаю, что со чтением файлов вы разобрались? Покажите, пожалуйста, что у вас получилось.
0
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
03.04.2015, 14:23  [ТС] 10
Вот класс который парсит xml:
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
public class ParseCh {
    
    public ParseCh(String chromPath) {
         TreeNodeParse(chromPath);
    }
 
    public void TreeNodeParse(String chromPath) {
        try
        {
            File xmlFile = new File(chromPath);
            JAXBContext jaxbContext = JAXBContext.newInstance(Chrom.class);
 
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Chrom customer = (Chrom)jaxbUnmarshaller.unmarshal(xmlFile);
             
            System.out.println("Данные" + 
                    "\n Имя: " + customer.getName() +
                    "\n Номер: " + customer.getNumber() +
                    "\n Дата анализа: " + customer.getAnalyseDate() +
                    "\n Оператор: " + customer.getUser() +
                    "\n Кол-во: " + customer.getRevision());
            System.out.println("Файл - " + xmlFile.getAbsolutePath());
 
        }
        catch (JAXBException jaxbe)
        {
            System.out.println(jaxbe.getLocalizedMessage());
            jaxbe.printStackTrace();
        }
    }    
}
Здесь только вывод части данных в консоль. Не знаю пока как привязать к выводу в JTree.
Класс Chrom был сгенерирован вышеописанным образом (xjc). Но предполагаю, что нужно иным образом все это делать, поскольку xml-ки могут быть разными.
ParseCh вызываю при нажатии на кнопку.
0
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
07.04.2015, 11:18  [ТС] 11
А вообще можно вместо конкретных данных, получать путь к этим данным (в виде дерева тегов)? и как?
0
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
17.04.2015, 11:22  [ТС] 12
В общем, в данный момент получилась программка, в которой выбираем файл, открываются и парсятся xml.
Показываем дерево, в котором, при нажатии на лист дерева, выводятся в EditorPane данные, полученные из xml файла.
Но пока сделал только для одного конкретного параметра из xml ( teg_data = channel1.getName(); )
Части кода:
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
// метод построения дерева
    public void createNodes(DefaultMutableTreeNode top) {
        DefaultMutableTreeNode chrom=null;
            DefaultMutableTreeNode channels=null; 
                DefaultMutableTreeNode channel=null;
            
        chrom = new DefaultMutableTreeNode(new Parse_Channel(chromPath,"Кром",nodeData));
        top.add(chrom);
  
        channels = new DefaultMutableTreeNode(new Parse_Channel(chromPath,"Каналы", nodeData));
        chrom.add(channels);
        channel = new DefaultMutableTreeNode(new Parse_Channel(chromPath,"Имя канала", nodeData));
        channels.add(channel);
    }
//метод вывода в EditorPane
    public void displayTegData(String str) {
            if (str != null) {
                TegPane.setText(str);
            }
            else { TegPane.setText("Not Found"); }
 
    }
// интерфейс выбора элементов дерева
    public void valueChanged(TreeSelectionEvent arg0) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
        if (node == null) return;
    
    Object nodeInfo = node.getUserObject();
    if (node.isLeaf()) {
        Parse_Channel teg = (Parse_Channel)nodeInfo;
        displayTegData(teg.teg_data);
    }
    }
Класс, который парсит файл и возвращает параметры "имя листа" и данные из тега xml
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
public class Parse_Channel {
    
    public String channelPath1, channelPath2;
    public String teg_name, teg_data, nodeName;
    public int num_channel;
    public URL url;
    
    public Parse_Channel(String path, String nName, String tdata) {
        TreeNodeParse(path, nName, tdata);
    }
    
    public void TreeNodeParse(String path, String nName, String tdata) {
        channelPath1 = path + "\\Channel_1\\Channel.xml";
        channelPath2 = path + "\\Channel_2\\Channel.xml";
        File channelFile1 = new File(channelPath1);
        File channelFile2 = new File(channelPath2);
        nodeName = nName;
        try
        {
            JAXBContext jaxbContextChan = JAXBContext.newInstance(Channel.class);
            Unmarshaller jaxbUnmarshChan = jaxbContextChan.createUnmarshaller();
            
            Channel channel1 = (Channel)jaxbUnmarshChan.unmarshal(channelFile1);     
            Channel channel2 = (Channel)jaxbUnmarshChan.unmarshal(channelFile2);  
 
            Channel.Samples channelSamples1 = (Channel.Samples)channel1.getSamples(); // +
            Channel.Samples channelSamples2 = (Channel.Samples)channel2.getSamples(); // +
 
            teg_data = channel1.getName();
        }
        catch (JAXBException jaxbe) {
            System.out.println(jaxbe.getLocalizedMessage());
            jaxbe.printStackTrace();
        }
}
        @Override
        public String toString() {
            return nodeName; 
        }
}
Подскажите пожалуйста, как теперь реализовать, чтобы при нажатии на конкретный лист дерева, возвращались данные относительно этого конкретного листа?
Миниатюры
Парсинг XML + построение дерева данных  
0
11 / 11 / 4
Регистрация: 12.03.2015
Сообщений: 94
17.04.2015, 11:43  [ТС] 13
То есть преобразовать метод класса Parse_Channel так, чтобы получая 2ой параметр (nName), возвращал, в соответствии этому параметру, данные из xml.
0
17.04.2015, 11:43
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2015, 11:43
Помогаю со студенческими работами здесь

Построение дерева на основании данных из Оракла
Добрый день! Есть древовидная таблица в Оракле... Как мне построить дерево в Делфи на основании...

Парсинг данных из простенького XML
Хочу сразу оговориться, я не программист и в PHP не силен. Есть нестандартный xml файл. Пытаюсь...

TreeView: построение дерева на основе данных из БД Access
Такова проблема. Есть 3 таблицы в БД. 1-компания, 2 - отдел, 3-пользователь в 1-компания столбцы ...

XML парсинг. Получение данных из функции
Добрый день. Столкнулся с следующей проблемой. Есть функция, которая должна читать XML и возвращать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru