Есть ли средства для разбора параметров тегов XML на языке Си? Как это лучше всего сделать?
>Есть ли средства для разбора параметров тегов XML на языке Си? Как
>это лучше всего сделать?libxml2?
>>Есть ли средства для разбора параметров тегов 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?
>Можете привести небольшой примерчик с использованием библиотеки libxml2?
да запросто:
/usr/share/doc/libxml2-<version>/examples/
>>>Есть ли средства для разбора параметров тегов 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 на языке Си? Как
>это лучше всего сделать?libxml2 тоже ничего, но я как-то больже expat уважаю.
http://expat.sourceforge.net/Единственно что придется немножко поплясать для обработки
всяких разных кодировок. man 3 iconv
>>Есть ли средства для разбора параметров тегов XML на языке Си? Как
>>это лучше всего сделать?
>
>libxml2 тоже ничего, но я как-то больже expat уважаю.
>http://expat.sourceforge.net/
>
>Единственно что придется немножко поплясать для обработки
>всяких разных кодировок. man 3 iconv
Никто не может привести премер для данного случая? Я много примеров из документации видел, но пока малопонятно (с xml раньше вообще не работал).
>Никто не может привести премер для данного случая? Я много примеров из
>документации видел, но пока малопонятно (с 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 раньше вообще не работал).#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 раньше вообще не работал).
>
>
>
>#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)
итд.
Заранее спасибо.
Исправил путь на /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
итд.
>Исправил путь на /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
вместо g++
gcc `xml2-config --cflags --libs` xml.c -o xmlP.S Код писался на и проверялся на freebsd6.0 6.1
>вместо g++
>gcc `xml2-config --cflags --libs` xml.c -o xml
>
>P.S Код писался на и проверялся на freebsd6.0 6.1Большое спасибо за код. В компилировании уже разобрался.