Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

Чем лучше парсить xml?

25.10.2013, 07:46. Показов 5085. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Panchus Посмотреть сообщение
Чем лучше парсить xml в linux?
Лучше всего с этим справляется C++.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2013, 07:46
Ответы с готовыми решениями:

Как лучше парсить XML?
Есть файл XML <?xml version="1.0" encoding="UTF-8"?> <places xmlns="http://where.yahooapis.com/v1/schema.rng"...

Чем лучше парсить Тwitter?
Подскажите пожалуйста чем лучше парсить твиттер. Хочу с помощью REST API получать данные, нужно будет собирать много данных, по этому хочу...

Как лучше парсить, из xml или json?
Вообщем посоветуйте чем лучше парсить? Есть 2 ссылки из которых нужно парсить: ...

53
 Аватар для t1m0n
638 / 416 / 27
Регистрация: 03.11.2009
Сообщений: 1,855
28.10.2013, 00:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
Я сказал, что одна из лучших это xMarkUp.
Ну или прога "Parser", которой пользуется всем известная студия Артемия Лебедева
1 раз узнал про них, как они могут быть лучше?

дальше - XML парсят с какой то целью, т.е. дальнейшая работа с данными смысл в вашей программе?

есть lxml написаная на с\с++

Доктор ТуамОсес, кстати можно было бы поставить виртуал бокс или любую другую виртуальную машину для 1 проги и не покупать старый комп для 95 винды
0
Заблокирован
15.09.2014, 21:35
Тоже думаю чем лучше парсить XML.
Говорят что на Prolog.
Что на прологе можно распарсить хоть чёрта лысого
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
16.09.2014, 18:55
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
Говорят что на Prolog.
Кто говорит, лол? http://www.swi-prolog.org/pldo... html%27%29 вот этим пользовался. В целом обычная библиотека по сериализации xml в prolog-овые структуры. И малоэффективная (касательно производительности) библиотека. Ну и конечно prolog-овые предложения тяжелее отлаживать, чем например какой-нибудь там xmls+optima для CL.

Добавлено через 56 секунд
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
Что на прологе можно распарсить хоть чёрта лысого
Да ну? Обманывают. DCG не эффективна, хотя и удобна.
0
Заблокирован
16.09.2014, 19:08
Цитата Сообщение от nullxdth Посмотреть сообщение
И малоэффективная (касательно производительности)
Я в курсе. Да. Пролог тормознут. Но зато только он может решить такие задачи, которые на других даже в принципе не решишь.
А потом парсинг - это же не реалтайм задача - можно и пождать.
Лучше потратить больше времени на ожидание окончания парсинга чем потратить больше времени на коддинг задачи

Добавлено через 1 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Ну и конечно prolog-овые предложения тяжелее отлаживать
Есть такое. Но есть же "Меркурий" (диалект пролога) в котором эту проблему хотя бы отчасти решили

Добавлено через 51 секунду
Цитата Сообщение от nullxdth Посмотреть сообщение
не эффективна
Не эффективна в смысле скорости парсинга или в скорости коддинга?
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
16.09.2014, 19:15
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
А потом парсинг - это же не реалтайм задача - можно и пождать.
Не всегда, к сожалению.
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
Лучше потратить больше времени на ожидание окончания парсинга чем потратить больше времени на коддинг задачи
Да, верно. Если не нужно парсить тонны какого-нибудь xml-а в runtime и нет требований к производительности.
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
Не эффективна в смысле скорости парсинга или в скорости коддинга?
В плане скорости парсинга.

Добавлено через 1 минуту
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
Но есть же "Меркурий" (диалект пролога) в котором эту проблему хотя бы отчасти решили
Вряд ли Mercury можно назвать диалектом prolog-а, это какой-то адский гибрид.
Мне не показалось, что его отлаживать проще (но допускаю, что у меня руки кривые)
0
Заблокирован
16.09.2014, 19:27
Цитата Сообщение от nullxdth Посмотреть сообщение
Да, верно. Если не нужно парсить тонны какого-нибудь xml-а в runtime
Естественно. Но слава Богу парсить в реалтайме тонны хэмээла практически никому не нужно

Добавлено через 1 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Мне не показалось, что его отлаживать проще (но допускаю, что у меня руки кривые)
Да он сложноват.
Просто он не для детских игр, а для серьёзных взрослых БОЛЬШИХ проектов

Добавлено через 54 секунды
Цитата Сообщение от nullxdth Посмотреть сообщение
Вряд ли Mercury можно назвать диалектом prolog-а, это какой-то адский гибрид.
Скорей уж "ученик, который превзошёл учителя
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.09.2014, 13:52
Для плюсов ничего лучше pugixml не находил. Супербыстро, функционал достаточен, для подключения достаточно положить файлы рядом и заинклюдить. Отдельное спасибо разрабу (кстати, соотечественнику) за поддержку перебора нод и атрибутов через циклы for-each из С++11.

На питоне lxml.
0
Заблокирован
19.09.2014, 22:15
Цитата Сообщение от MrGluck Посмотреть сообщение
Для плюсов
ПюсЫ юзать для парсинга это всё равно что пытаться почесать левое ухо правой рукой через голову

Добавлено через 18 секунд
Это можно конечно. Но неудобно
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
20.09.2014, 12:09
Цитата Сообщение от MrGluck Посмотреть сообщение
Для плюсов ничего лучше pugixml не находил
Есть же XSD и XSDe. Минимум ручной работы, декларативно, статически типизировано. Предел мечтаний. Но любителям динамики вероятно не понравится
0
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443
02.10.2014, 09:24
Цитата Сообщение от programina Посмотреть сообщение
зачем мне другой язык, если есть С++
Чтобы на С++ что-то парсить, это надо быть идиотом. Это еще Луговский говорил.
Лисп конечно.
0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
02.10.2014, 09:59
XML парсер на С++
Code
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include <vcl.h>
#pragma hdrstop
 
#include "XMLParser.h"
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
 
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
 
XmlParser::XmlParser(string fileName) : m_fileName(fileName)
{
  // Открыть файл XML документа.
  curState = 0;
  predStack = 0;
  startNode = NULL;
  fp = fopen( fileName.c_str(), "r" );
}
 
XmlParser::~XmlParser()
{
// Закрываем XML файл и высвобождаем все ресурсы
  fclose(fp);
}
 
int XmlParser::runParse()
{   
char predChar;// Предыдущий символ
char curChar; // Текущий символ
curState = 0;
gotAttribName = false;// Имя или значение атрибута
numArgs = -1;
bool startTag = false;
 // Process characters until the file is empty.
    predChar = ' ';
    curChar = (char)fgetc(fp);
    while(!feof(fp))
    {
      switch(curState)
      {
    case XML_NOSTATE:// Стартовый тег ещё не найден
      if (curChar == '<')// Нашли стартовый тег
      {
            if(numArgs >= 0)
              for(int i=0; i<=numArgs; i++)
              {
                curArgs[i].argName = "";
                curArgs[i].argValue = "";
              }
            curText = "";
            startTag = false;
        curState = XML_TAGNAME;// Переходим к получению наименования тега
        numArgs = -1;           // Сбрасываем счётчик аргументов
        curTagName = "";        // Обнуляем имя тега
        gotAttribName = false;  // Получить имя атрибута
      }
       break;
 
    case XML_TAGNAME:// Получаем наименование тега
          if((predChar == '<' && curChar == '!') ||
             (predChar == '<' && curChar == '?')) {curState = XML_NOSTATE; break;}
          if(predChar == '<' && curChar == '/')// Переходим на ввод замыкающего тега
            {curState = XML_ENDTAG; break;}
          // Только латинские буквы, цифры от 0 до 9 и знак подчёркивания
      if ((curChar >= 'a' && curChar <= 'z')||(curChar >= 'A' && curChar <= 'Z')||
              (curChar >= '0' && curChar <= '9') || curChar == '_')
        curTagName += curChar;// Если символ допустимый, то формируем имя тега
      else
            if (curChar == ' ')
              {
            curState = XML_TAGATTRIB;// Имя получено, переходим к получению аргументов
                numArgs++;
              }
        else
              if (curChar == '>')// Тег закрылся, переходим к анализу нового тега
          {
        curState = XML_NOTAG;
        // Имя тега, количество атрибутов и массив аргументов передаём для анализа
        beginTag(curTagName, numArgs, curArgs);
          }
              else return 1; // Ошибка в имени тега
      break;
 
    case XML_TAGATTRIB:// Получение атрибутов тега
          if(gotAttribName)
            {
              if((predChar == '=' && curChar == '"') ||
                 (predChar == '"' && curChar == '"'))
                 break;
              if((predChar == '"' && curChar == '>') ||
                 (predChar == '"' && curChar == '/'))
              {
                curState = XML_NOTAG;
                beginTag(curTagName, numArgs, curArgs);
                break;
              }
              if(predChar == '"' && curChar == ' ')
              {
                gotAttribName = false;
                numArgs++;
                break;
              }
              else
              {
                if(curChar != '"')
                  curArgs[numArgs].argValue += curChar;
                break;
              }
            }
          else  
          {
            // Символ допустимый?
        if ((curChar >= 'a' && curChar <= 'z')||(curChar >= 'A' && curChar <= 'Z')||
                (curChar >= '0' && curChar <= '9') || curChar == '_')
        { // Да, формируем имя аргумента
              curArgs[numArgs].argName += curChar; break;
            }
            else // Нет
            {
              if(curChar == '='){gotAttribName = true; break;}
              return 2;// Ошибка в аргументе
            }
          }
 
    case XML_NOTAG:
              if(predChar == '/' && curChar == '>')
              {
                curState = XML_NOSTATE;
                break;
              }
      if (curChar == '<')
      {
        startTag = true;
            curState = XML_NOSTATE;
            if(curText != "")
              doInside(curText);
      }
      else
      {
            if((predChar == '>' && curChar == ' ') ||
               (predChar == ' ' && curChar == ' ') ||
               (predChar == ' ' && curChar == '<') ||
                curChar == '\n' || curChar == '\t') break;
        curText += curChar;
      }
          break;
    case XML_ENDTAG:
      if (curChar == '>')
      {
        curState = XML_NOSTATE;
        endTag(curTagName);
      }
      else
            // Только латинские буквы, цифры от 0 до 9 и знак подчёркивания
            if ((curChar >= 'a' && curChar <= 'z')||(curChar >= 'A' && curChar <= 'Z')||
                (curChar >= '0' && curChar <= '9') || curChar == '_')
          curTagName += curChar;
          break;
      } // end switch
      if(!startTag)
      {
        predChar = curChar;// Сохраняем предыдущий символ
        curChar = (unsigned char)fgetc(fp);
      }
    } // end while
return 0;
}
// Имя и атрибуты тега получены
bool XmlParser::beginTag(string tagID, int numParams, TagArg params[10])
{
/* Создаём новый узел
newNode = new XMLnode;    // Создаём корневой элемент списка
newNode->tagName = tagID; // Вводим имя тега
newNode->tagText = "";    // Текст тега = пустая строка
newNode->numParams = numParams;
if(numParams >= 0)// Вводим параметры
  for(int i=0; i<=numParams; i++) newNode->argum[i] = params[i];
newNode->leftNode  = NULL;
newNode->rightNode = NULL;
 
if(Stack.empty())// Стек пуст ?
{// Да, создать корневой узел
  startNode = newNode;
  leftNode  = newNode;
  rightNode = newNode;    
}
else
{
  if(Stack.size() == predStack)// Текущее = предыдущему ?
  {// Да, добавить в правую ветку
    rightNode = newNode;
  }
  else
  {
    if(Stack.size() > predStack)// Текущее больше предыдущего ?
    {// Да, добавить в левую ветку
       //int size = Stack.size();
    }
    else// Нет, добавить в правую ветку
      if((Stack.size() +1) != predStack)// Текущее +1 != предыдущему ?
      {// Ошибка в порядке следования тегов
        return false;
      }
  }
}
predStack = Stack.size();
Stack.push(tagID);*/
//string N = params[0].argName;
//string V = params[0].argValue;
return true;
//
}
// Имя закрывающего тега получено
void XmlParser::endTag(string tagID)
{/*
if(! Stack.empty())
{
  Stack.pop();
  predStack = Stack.size();
} */
return;
}
// Текст между тегами получен
void XmlParser::doInside(string tagText)
{
return;
}
Добавлено через 6 минут
Н-файл XML-парсера

Code
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
// Пример подключения класса
XmlParser * XMP = new XmlParser("Test.xml");
XMP->runParse();
delete XMP;
*/
//---------------------------------------------------------------------------
#ifndef __XMLPARSER_H
#define __XMLPARSER_H
 
#include <stack>
#include <string>
//#include <stdio.h>
 
#define XML_NOSTATE   0
#define XML_TAGNAME   1
#define XML_TAGATTRIB 2
#define XML_NOTAG     3
#define XML_ENDTAG    4
using namespace::std;
 
// Тип Данных для параметров тэга
struct TagArg
{
    string argName;
    string argValue;
};
 
struct XMLnode
{
string tagName;
string tagText;
int numParams;
TagArg argum[10];
XMLnode *leftNode;// Движение по столбцу
XMLnode *rightNode;// Движение по строке
};
/*
struct XMLrecipe
{
bool ooo;
int arg;
XMLnode argum[3];
int desc;
XMLnode descript[10];
int ingr;
XMLnode ingred[25];
//XMLrecipe recipe_ptr;
};
*/
class XmlParser
{
public:
    XmlParser(string fileName);
    ~XmlParser();
 
    int runParse();
 
protected:
    virtual void endTag(string tagID);
    virtual bool beginTag(string tagID, int numParams, TagArg params[10]);
    virtual void doInside(string tagText);
 
private:
        stack<string> Stack;
        unsigned int predStack;
 
    string m_fileName; // Имя файла
    FILE* fp;
 
    int curState;      // Переключатель
    bool gotAttribName; // false - имя атрибута true - его параметр
 
    string curTagName;  // Наименование тега
    string curText;     // Текст между тегами
 
    int numArgs;       // Количество атрибутов
    TagArg curArgs[10]; // Список атрибутов
 
        // Переменные управления узлами
        XMLnode *newNode;  // Указатель на новый узел
        XMLnode *startNode;// Указатель на первый элемент
        XMLnode *leftNode;  // Указатель на последний элемент столбца
        XMLnode *rightNode;  // Указатель на последний элемент строки
 
};
 
#endif
0
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443
02.10.2014, 10:23
Отвечу обязательно, как напишу на Лиспе. Может не скоро, но напишу, сюда или в личку.

Добавлено через 10 минут
Цитата Сообщение от Nameless One Посмотреть сообщение
Сообщение от programina
Именно. зачем мне другой язык, если есть С++?
Blub paradox в действии.
Точно! Это ж Парадокс Блаба
0
Заблокирован
07.10.2014, 20:10
А Icon (или его более навороченный диалект Unicon) никто не юсает что ли для парсинга XML?
А студия Лебедева на нём даже написала свой X Markup написала и уверяет что ничего нет лучше для пасинга хэмээля, чем ICON/UNICON

Добавлено через 1 минуту
Цитата Сообщение от Cheb Посмотреть сообщение
Лисп конечно.
Скорей уж Prolog. Там есть откаты
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.10.2014, 14:30
Цитата Сообщение от Доктор ТуамОсес Посмотреть сообщение
Там есть откаты
Да ладно?! И там откаты :-( Чёртова коррупция.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2014, 14:30

Чем парсить xml?
Чем лучше парсить xml в linux?

Чем лучше парсить регулярками или HtmlAgility?
Имеется такой код &lt;li class=&quot;proxy&quot;&gt;212.82.126.32:80&lt;/li&gt; &lt;li class=&quot;https&quot;&gt;HTTP&lt;/li&gt; &lt;li...

Чем XPath лучше других методов работы с XML?
Здравствуйте. Не раз натыкался на темы, где у автора возникали проблемы с работай с XML, часто видел ответ :&quot;Используй лучше xpath...

Подскажите, как парсить все xml файлы, вложенные в дочерние директории с исп. xml.dom.minidom?
Всем привет. Есть следующая структура папок: &lt;img src=&quot;https://habrastorage.org/webt/5d/0b/8f/5d0b8f031f86c050844094.png&quot;...

Парсить XML
Всем привет!! Подскажите как правильно сделать программу и xml файл. Работаю в фирме написал поргу для сотрудников для документов....


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

Или воспользуйтесь поиском по форуму:
54
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru