Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для templllar
2 / 2 / 1
Регистрация: 17.05.2009
Сообщений: 99

Парсинг XML. Получение значения поля

30.03.2017, 11:49. Показов 2614. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

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

Структура XML примерно такая:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<Results>
    <msg type = "0520">
        <field id = "1" value = "000001"/>
        <field id = "2" value = "0324"/>
            <subField id = "R1" value = "500" /> 
            <subField id = "R2" value = "0000000000" /> 
        </field>
         </msg>
         <msg type = "0521">
        <field id = "1" value = "000002"/>
        <field id = "2" value = "0325"/>
            <subField id = "R1" value = "600" /> 
            <subField id = "R2" value = "0000000001" /> 
        </field>
         </msg>
</Result>
Все, что я смог прочитать, это атрибут у <msg>

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
File xmlFilePath = getHomePath().resolve(fileName).toFile();
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
InputStreamReader in = new InputStreamReader(new BufferedInputStream(new FileInputStream(xmlFilePath)), "Cp1251");
doc = docBuilder.parse(new InputSource(in));
doc.getDocumentElement().normalize();
 
//Получаю <msg>
NodeList nodes = doc.getElementsByTagName(doc.getDocumentElement().getChildNodes().item(1).getNodeName());
//Получаю атрибуты первого msg
NamedNodeMap attributes = nodes.item(0).getAttributes();
String attName = attributes.item(0).getNodeName();
String attValue = attributes.item(0).getNodeValue();
Просьба помочь получить value из любого field и из любого subfield. Пробовал передвигаться ниже по иерархии с помощью getChildNodes(), но получается какая та ерунда.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2017, 11:49
Ответы с готовыми решениями:

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

Парсинг XML (получение строки из определённого тега)
здравствуйте, есть xml-документ который необходимо пропарсить: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;rss...

Парсинг XML-документа, в котором некоторые поля могут отсутствовать
Есть такой XML-файл: &lt;shop&gt; &lt;title&gt;Any product&lt;/title&gt; &lt;price&gt;10.1&lt;/price&gt; &lt;/shop&gt; &lt;shop&gt; ...

11
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
30.03.2017, 11:56
Могу порекомендовать чисто попробовать JDOM2, там все максимально просто и интуитивно понятно.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.03.2017, 12:02
это вообще валидный xml?
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
30.03.2017, 12:04
Цитата Сообщение от Паблито Посмотреть сообщение
это вообще валидный xml?
Судя по всему - нет
Открывающий тэг <Results>, а закрывается тэгом </Result>
1
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.03.2017, 12:06
с field тоже странно
0
 Аватар для templllar
2 / 2 / 1
Регистрация: 17.05.2009
Сообщений: 99
30.03.2017, 12:09  [ТС]
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Судя по всему - нет
Открывающий тэг <Results>, а закрывается тэгом </Result>
Вручную писал, опечатка
И field тоже поправил

Добавлено через 2 минуты
Исправил:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<Results>
    <msg type = "0520">
        <field id = "1" value = "000001"/>
        <field id = "2">
            <subField id = "R1" value = "500" /> 
            <subField id = "R2" value = "0000000000" /> 
        </field>
         </msg>
         <msg type = "0521">
        <field id = "1" value = "000002"/>
        <field id = "2">
            <subField id = "R1" value = "600" /> 
            <subField id = "R2" value = "0000000001" /> 
        </field>
         </msg>
</Results>
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.03.2017, 12:16
Jsoup на раз-два такое парсит в dom
Java
1
2
3
4
5
6
7
8
9
10
11
        Document doc = Jsoup.parse(StaticMap.xmlStr);
        Elements fields = doc.select("field");
        Elements subfields = doc.select("subfield");
 
        for (Element e : fields) {
            System.out.println(e.val());
        }
 
        for (Element s : subfields) {
            System.out.println( s.val());
        }
1
 Аватар для templllar
2 / 2 / 1
Регистрация: 17.05.2009
Сообщений: 99
30.03.2017, 12:28  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
Jsoup на раз-два такое парсит в dom
Выглядит просто. А так же просто можно выполнить следующие вещи?
1) найти value у field с id=1
2) найти value у subfield с id=R1, который лежит внутри field с id=1
3) понять, есть ли например у field с id=1 subfields
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.03.2017, 12:39
https://jsoup.org/apidocs/org/... ector.html
Цитата Сообщение от templllar Посмотреть сообщение
найти value у field с id=1
Java
1
Elements elements = doc.select("field#1");
Цитата Сообщение от templllar Посмотреть сообщение
найти value у subfield с id=R1, который лежит внутри field с id=1
в примере нет таких, поэтому вернет пустой список, но можно поискать gj field id = 2 например
Java
1
doc.select("field#2 subfield#R1");
Цитата Сообщение от templllar Посмотреть сообщение
понять, есть ли например у field с id=1 subfields
Java
1
2
3
        if (!doc.select("field#1 subfield").isEmpty()) {
            // что-то там  есть, идем по списку
        }
0
 Аватар для templllar
2 / 2 / 1
Регистрация: 17.05.2009
Сообщений: 99
30.03.2017, 12:44  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
Elements elements = doc.select("field#1");
не совсем понимаю, почему атрибут "id" интерпретируется как #
а если был бы тег <field type="abc" text="123">, как найти элемент по type?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
30.03.2017, 12:44
по ссылке почитать не?
1
 Аватар для templllar
2 / 2 / 1
Регистрация: 17.05.2009
Сообщений: 99
30.03.2017, 14:21  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
по ссылке почитать не?
разобрался, благодарю

Добавлено через 1 час 31 минуту
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Могу порекомендовать чисто попробовать JDOM2, там все максимально просто и интуитивно понятно.
Спасибо, с JDOM2 все получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2017, 14:21
Помогаю со студенческими работами здесь

Парсинг XML, присвоение значения Qdoublespinbox из файла
Здравствуйте, В GUI у меня есть несколько Qdoublespinbox'ов, хочу присваивать значения этим боксам при запуске с .xml, который будет...

Получение значения из xml
Всем привет! Подскажите пожалуйста, как вытащить значение “Param” из xml следующей структуры: &lt;?xml version=&quot;1.0&quot;...

Получение значения из XML-файла
Всем доброго времени суток! По WebDav возвращается XML-файл с информацией о файле (пример структуры): &lt;?xml...

получение значения поля из БД
Добрый день, нужно получить результат выполнения запроса, возвращающего значение одного поля из бд Oracle. Н-р: select (CODE)...

Получение значения из поля со списком
Здравствуйте! У меня такая проблема: У меня есть поле со списком по имени field. В нем я выбираю значение и нажимаю на кнопку и перехожу...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru