URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5492
[ Назад ]

Исходное сообщение
"XML разбор параметров на Си"

Отправлено ap , 12-Июн-06 21:03 
Есть ли средства для разбора параметров тегов XML на языке Си? Как это лучше всего сделать?

Содержание

Сообщения в этом обсуждении
"XML разбор параметров на Си"
Отправлено chip , 12-Июн-06 21:38 
>Есть ли средства для разбора параметров тегов XML на языке Си? Как
>это лучше всего сделать?

libxml2?



"XML разбор параметров на Си"
Отправлено ap , 13-Июн-06 10:09 
>>Есть ли средства для разбора параметров тегов XML на языке Си? Как
>>это лучше всего сделать?
>
>libxml2?

Помогите пожалуйста со следующей задачей (я новичек в XML):
есть следующий фрагмент XML-кода:

<request>
<header action=”payment” dealer=”mCash”/>
<account service=”0” id=”Иванов Иван” id2=”123456879” id3=”” id4=”” />
<operation id=”7456646” sum=”9.45” point=”350” check=”17235”/>
</request>

Мне нужно на Си (в Linux) прочитать параметры action,dealer,account service,id,operation id итд. Можете привести небольшой примерчик с использованием библиотеки libxml2?


"XML разбор параметров на Си"
Отправлено guest , 14-Июн-06 02:31 

>Можете привести небольшой примерчик с использованием библиотеки libxml2?
да запросто:
/usr/share/doc/libxml2-<version>/examples/

"XML разбор параметров на Си"
Отправлено ap , 20-Июн-06 09:35 
>>>Есть ли средства для разбора параметров тегов XML на языке Си? Как
>>>это лучше всего сделать?
>>
>>libxml2?
>
>Помогите пожалуйста со следующей задачей (я новичек в XML):
>есть следующий фрагмент XML-кода:
>
><request>
><header action=”payment” dealer=”mCash”/>
><account service=”0” id=”Иванов Иван” id2=”123456879” id3=”” id4=”” />
><operation id=”7456646” sum=”9.45” point=”350” check=”17235”/>
></request>
>
>Мне нужно на Си (в Linux) прочитать параметры action,dealer,account service,id,operation id итд.
>Можете привести небольшой примерчик с использованием библиотеки libxml2?

Никто не может привести премер для данного случая? Я много примеров из документации видел, но пока малопонятно (с xml раньше вообще не работал).


"XML разбор параметров на Си"
Отправлено DeadMustdie , 18-Июн-06 23:57 
>Есть ли средства для разбора параметров тегов XML на языке Си? Как
>это лучше всего сделать?

libxml2 тоже ничего, но я как-то больже expat уважаю.
http://expat.sourceforge.net/

Единственно что придется немножко поплясать для обработки
всяких разных кодировок. man 3 iconv


"XML разбор параметров на Си"
Отправлено ap , 20-Июн-06 13:09 
>>Есть ли средства для разбора параметров тегов XML на языке Си? Как
>>это лучше всего сделать?
>
>libxml2 тоже ничего, но я как-то больже expat уважаю.
>http://expat.sourceforge.net/
>
>Единственно что придется немножко поплясать для обработки
>всяких разных кодировок. man 3 iconv
Никто не может привести премер для данного случая? Я много примеров из документации видел, но пока малопонятно (с xml раньше вообще не работал).


"XML разбор параметров на Си"
Отправлено DeadMustdie , 21-Июн-06 18:41 
>Никто не может привести премер для данного случая? Я много примеров из
>документации видел, но пока малопонятно (с xml раньше вообще не работал).

Понятнее, чем в семплах, вряд ли будет.

Собственно, семпл, печатает элементы XML-документа:

#include <stdio.h>
#include "expat.h"

static void XMLCALL
startElement(void *userData, const char *name, const char **atts)
{
  int i;
  int *depthPtr = userData;
  for (i = 0; i < *depthPtr; i++)
    putchar('\t');
  puts(name);
  *depthPtr += 1;
}

static void XMLCALL
endElement(void *userData, const char *name)
{
  int *depthPtr = userData;
  *depthPtr -= 1;
}

int
main(int argc, char *argv[])
{
  char buf[BUFSIZ];
  XML_Parser parser = XML_ParserCreate(NULL);
  int done;
  int depth = 0;
  XML_SetUserData(parser, &depth);
  XML_SetElementHandler(parser, startElement, endElement);
  do {
    size_t len = fread(buf, 1, sizeof(buf), stdin);
    done = len < sizeof(buf);
    if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
      fprintf(stderr,
              "%s at line %d\n",
              XML_ErrorString(XML_GetErrorCode(parser)),
              XML_GetCurrentLineNumber(parser));
      return 1;
    }
  } while (!done);
  XML_ParserFree(parser);
  return 0;
}


"XML разбор параметров на Си"
Отправлено Steck , 27-Июн-06 03:54 
>>Никто не может привести премер для данного случая? Я много примеров из
>>документации видел, но пока малопонятно (с xml раньше вообще не работал).

#include <stdio.h>
#include <libxml/parser.h>
#define CONF "/home/steck/file.xml"

int main(int argc, char *argv[])
{
xmlNodePtr cur;
xmlDocPtr doc;

doc = xmlParseFile(CONF);
  if(doc == NULL)
  {
    fprintf(stderr,"Error parsing file\n");
    return -1;
  }
  cur = xmlDocGetRootElement(doc);
  if(xmlStrcmp(cur->name,(const xmlChar *)"request"))
    return -1;
  cur = cur->xmlChildrenNode;
  while(cur != NULL)
  {
      if((!xmlStrcmp(cur->name,(const xmlChar *)"header")))
            {
                    printf("Section \"header\"\n");
                    printf("action = %s\n",xmlGetProp(cur,"action"));
                    printf("dealer = %s\n",xmlGetProp(cur,"dealer"));
            }
             if((!xmlStrcmp(cur->name,(const xmlChar *)"account")))
        {
                    printf("Section \"account\"\n");
                printf("service = %s\n",xmlGetProp(cur,"service"));
                printf("id = %s\n",xmlGetProp(cur,"id"));
                printf("id2 = %s\n",xmlGetProp(cur,"id2"));
                printf("id3 = %s\n",xmlGetProp(cur,"id3"));
                printf("id4 = %s\n",xmlGetProp(cur,"id4"));
                        
        }
                if((!xmlStrcmp(cur->name,(const xmlChar *)"operation")))
                {
                    printf("Section \"Operation\"\n");

                    printf("id = %s\n",xmlGetProp(cur,"id"));
                    printf("sum = %s\n",xmlGetProp(cur,"sum"));
                    printf("point = %s\n",xmlGetProp(cur,"point"));
                    printf("check = %s\n",xmlGetProp(cur,"check"));
                }
                cur = cur->next;
    }
    }

Держи
Может поможет..


"XML разбор параметров на Си"
Отправлено ap , 26-Июл-06 13:46 
>>>Никто не может привести премер для данного случая? Я много примеров из
>>>документации видел, но пока малопонятно (с xml раньше вообще не работал).
>
>
>
>#include <stdio.h>
>#include <libxml/parser.h>
>#define CONF "/home/steck/file.xml"
>
>int main(int argc, char *argv[])
>{
>xmlNodePtr cur;
>xmlDocPtr doc;
>
> doc = xmlParseFile(CONF);
>  if(doc == NULL)
>  {
>    fprintf(stderr,"Error parsing file\n");
>    return -1;
>  }
>  cur = xmlDocGetRootElement(doc);
>  if(xmlStrcmp(cur->name,(const xmlChar *)"request"))
>    return -1;
>  cur = cur->xmlChildrenNode;
>  while(cur != NULL)
>  {
>      if((!xmlStrcmp(cur->name,(const xmlChar *)"header")))
>   {
>     printf("Section \"header\"\n");
>     printf("action = %s\n",xmlGetProp(cur,"action"));
>     printf("dealer = %s\n",xmlGetProp(cur,"dealer"));
>   }
>             if((!xmlStrcmp(cur->name,(const xmlChar *)"account")))
>        {
>     printf("Section \"account\"\n");
>    printf("service = %s\n",xmlGetProp(cur,"service"));
>    printf("id = %s\n",xmlGetProp(cur,"id"));
>    printf("id2 = %s\n",xmlGetProp(cur,"id2"));
>    printf("id3 = %s\n",xmlGetProp(cur,"id3"));
>    printf("id4 = %s\n",xmlGetProp(cur,"id4"));
>
>        }
>                if((!xmlStrcmp(cur->name,(const xmlChar *)"operation")))
>    {
>     printf("Section \"Operation\"\n");
>
>     printf("id = %s\n",xmlGetProp(cur,"id"));
>     printf("sum = %s\n",xmlGetProp(cur,"sum"));
>     printf("point = %s\n",xmlGetProp(cur,"point"));
>     printf("check = %s\n",xmlGetProp(cur,"check"));
>    }
>                cur = cur->next;
> }
> }
>
>Держи
>Может поможет..

Какие библитеки для этого необходимы, не находит путь к parser.h.
Установил libxml2, libxml2-devel. Как правильно указать путь к библеотекам? Пробовал как в примери и так: #include </usr/include/libxml2/parser.h>. Выдает:
make
g++ -g -mpentium -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq -L/usr/lib -lstdc++  xml.cpp -o  xml
xml.cpp:3:41: /usr/include/libxml2/parser.h: No such file or directory
xml.cpp: In function `int main(int, char**)':
xml.cpp:8: error: `xmlNodePtr' undeclared (first use this function)
итд.
Заранее спасибо.


"XML разбор параметров на Си"
Отправлено ap , 26-Июл-06 13:51 
Исправил путь на /usr/include/libxml2/libxml/. Теперь выдает кучу ошибок.
/usr/include/libxml2/libxml/parser.h:15:31: libxml/xmlversion.h: No such file or directory
/usr/include/libxml2/libxml/parser.h:16:25: libxml/tree.h: No such file or directory
/usr/include/libxml2/libxml/parser.h:17:25: libxml/dict.h: No such file or directory
/usr/include/libxml2/libxml/parser.h:18:25: libxml/hash.h: No such file or directory
/usr/include/libxml2/libxml/parser.h:19:26: libxml/valid.h: No such file or directory
/usr/include/libxml2/libxml/parser.h:20:29: libxml/entities.h: No such file or directory
/usr/include/libxml2/libxml/parser.h:21:29: libxml/xmlerror.h: No such file or directory
/usr/include/libxml2/libxml/parser.h:22:30: libxml/xmlstring.h: No such file or directory
In file included from xml.cpp:3:
/usr/include/libxml2/libxml/parser.h:52: error: typedef `xmlParserInputDeallocate' is initialized (use __typeof__ instead)
/usr/include/libxml2/libxml/parser.h:52: error: `xmlChar' was not declared in this scope
/usr/include/libxml2/libxml/parser.h:52: error: `str' was not declared in this scope
итд.

"XML разбор параметров на Си"
Отправлено ap , 26-Июл-06 15:18 
>Исправил путь на /usr/include/libxml2/libxml/. Теперь выдает кучу ошибок.
>/usr/include/libxml2/libxml/parser.h:15:31: libxml/xmlversion.h: No such file or directory
>/usr/include/libxml2/libxml/parser.h:16:25: libxml/tree.h: No such file or directory
>/usr/include/libxml2/libxml/parser.h:17:25: libxml/dict.h: No such file or directory
>/usr/include/libxml2/libxml/parser.h:18:25: libxml/hash.h: No such file or directory
>/usr/include/libxml2/libxml/parser.h:19:26: libxml/valid.h: No such file or directory
>/usr/include/libxml2/libxml/parser.h:20:29: libxml/entities.h: No such file or directory
>/usr/include/libxml2/libxml/parser.h:21:29: libxml/xmlerror.h: No such file or directory
>/usr/include/libxml2/libxml/parser.h:22:30: libxml/xmlstring.h: No such file or directory
>In file included from xml.cpp:3:
>/usr/include/libxml2/libxml/parser.h:52: error: typedef `xmlParserInputDeallocate' is initialized (use __typeof__ instead)
>/usr/include/libxml2/libxml/parser.h:52: error: `xmlChar' was not declared in this scope
>/usr/include/libxml2/libxml/parser.h:52: error: `str' was not declared in this scope
>итд.
Теперь выдает:
xml.cpp:26: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:26: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:27: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:27: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:32: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:32: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:33: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:33: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:34: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:34: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:35: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:35: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:36: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:36: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:42: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:42: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:43: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:43: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:44: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:44: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:45: error: invalid conversion from `const char*' to `const xmlChar*'
xml.cpp:45: error:   initializing argument 2 of `xmlChar* xmlGetProp(xmlNode*, const xmlChar*)'
xml.cpp:49:4: warning: no newline at end of file
make: *** [default] Error 1


"XML разбор параметров на Си"
Отправлено Steck , 29-Июл-06 08:05 
вместо g++
gcc `xml2-config --cflags --libs` xml.c -o xml

P.S Код писался на и проверялся на freebsd6.0 6.1


"XML разбор параметров на Си"
Отправлено ap , 29-Июл-06 10:40 
>вместо g++
>gcc `xml2-config --cflags --libs` xml.c -o xml
>
>P.S Код писался на и проверялся на freebsd6.0 6.1

Большое спасибо за код. В компилировании уже разобрался.