Как я могу прочитать XML-файл в буфер на C?

Я хочу прочитать XML-файл в char * buffer с помощью C.

Как лучше всего это сделать?

С чего начать?


9

И если вы хотите анализировать XML, а не просто читать его в буфер (что-то, что не было бы специфичным для XML, см. ответы Кристофа и Багета), вы можете использовать для экземпляр libxml2:

  #include  #include  #include  int main (int argc, char ** argv  ) {xmlDoc * документ;  xmlNode * root, * first_child, * узел;  char * имя файла;  if (argc  (% i)  n», root-> имя, root-> тип);  first_child = корень-> дети;  for (node ​​= first_child; node; node = node-> next) {fprintf (stdout, " t Child is  (% i)  n", node-> name, node-> type);  } fprintf (stdout, "...  n");  return 0;}  

На машине Unix вы обычно компилируете вышеуказанное с помощью:

 % gcc -o read-xml  $ (xml2-config --cflags) -Wall $ (xml2-config --libs) read-xml.c  

Улучшите этот ответ
ответил 20 декабря ’08 в 13:05
  • 1.0E99 спасибо! Код и флаги компиляции — отличный пример. Не можете поверить, что никто не отметил, что это полезно за 8 лет? — phs 24 фев, в 15:16
добавить комментарий |

И если вы хотите разбирать XML, а не просто читать его в буфер (что-то, что не быть специфичным для XML, см. ответы Кристофа и Багета), вы можете использовать, например, libxml2:

  #include  #include  #include   int main (int argc, char ** argv) {xmlDoc * документ;  xmlNode * root, * first_child, * узел;  char * имя файла;  if (argc  (% i)  n», root-> имя, root-> тип);  first_child = корень-> дети;  for (node ​​= first_child; node; node = node-> next) {fprintf (stdout, " t Child is  (% i)  n", node-> name, node-> type);  } fprintf (stdout, "...  n "); return 0;}  

На машине Unix вы обычно компилируете вышеуказанное с помощью:

 % gcc  -o read-xml $ (xml2-config --cflags) -Wall $ (xml2-config --libs) read-xml.c  

7

Считывает содержимое файла в один простой буфер действительно Что вы хотите сделать? XML-файлы обычно существуют для анализа, и вы можете сделать это с помощью такой библиотеки, как libxml2, просто чтобы привести один пример (но, в частности, реализован на C).

Улучшить этот ответ
ответ дан 19 дек. ’08 в 17:03
добавить комментарий |

Читает содержимое то файл в один простой буфер действительно , что вы хотите сделать? Файлы XML обычно предназначены для анализа, и вы можете сделать это с помощью такой библиотеки, как libxml2, просто чтобы дать один пример (но, в частности, реализован на C).


4

Надеюсь, код ISO-C без ошибок для чтения содержимого файла и добавления ‘ 0’ char:

  #include  #include  long fsize (FILE * file) {if (fseek (file, 0, SEEK_END)) return  -1;  long size = ftell (файл);  если (размер  

Улучшите этот ответ
отредактировано 20 декабря ’08 в 13:22
ответил 19 декабря ’08 в 23:58
добавить комментарий |

Надеюсь, код ISO-C без ошибок для чтения содержимого файла и добавления символа ‘ 0’:

  #include  #include  long fsize (FILE * file) {if (fseek (file, 0, SEEK_END)) return -1;  long size = ftell (файл);  если (размер  

3

  1. Установите libxml2 как пакет NuGet в Visual Studio (я использую Vs 2015 для проверки)
  2. Скопируйте и вставьте содержимое из примера XML-файла в блокнот и сохраните файл как example.xml
  3. Скопируйте и вставьте код при//синтаксическом разборе XML в Vs
  4. Вызовите функцию из основного с именем файла xml в качестве аргумента
  5. Вы получите XML-данные в configReceive

Вот и все …

пример XML-файла:

   xml version = "1.0" encoding = "utf-8"?>           

Вот исходный код:

  #include  #include  #include  #include  #include  #include  char configReceive [6] [80] = {""  };//xml parsingvoid ParsingXMLFile (char * filename) {char * docname;  xmlDocPtr doc;  xmlNodePtr cur;  xmlChar * uri;  char config [6] [80] = {"значение1", "значение2", "значение3", "значение4", "значение5", "значение6"};  int count = 0;  int count1 = 0;  docname = имя файла;  doc = xmlParseFile (имя документа);  cur = xmlDocGetRootElement (документ);  cur = cur-> xmlChildrenNode;  while (cur! = NULL) {если ((! xmlStrcmp (cur-> name, (const xmlChar *) "xmlConfig"))) {uri = xmlGetProp (cur, (xmlChar *) config [count ++]);  strcpy (configReceive [count1 ++], (char *) uri);  xmlFree (uri);  } cur = cur-> следующий;  } count = 0;  count1 = 0;  xmlFreeDoc (doc);}  

Улучшите этот ответ
отредактировано 13 июля ’17 в 17:33
chqrlie
90. 9k1010 золотых знаков8383 серебряных знака142142 бронзовых знака
13 июля ’17 в 16:22
  • Это рабочий код. Пожалуйста, попробуйте оставить свои комментарии, если any.Thank you — Banamali Mishra 13 июл в 13:27
добавить комментарий |

  1. Установите libxml2 как пакет NuGet в Visual Studio (я использую Vs 2015 для проверки)
  2. Скопируйте и вставьте содержимое из примера XML-файла в блокнот и сохраните файл как example.xml
  3. Скопируйте и вставьте код из//XML-синтаксического анализа в Vs
  4. Вызов функции из main с именем файла xml в качестве аргумента.
  5. Вы получите данные xml в configReceive

Это все …

пример XML-файла:

   xml version = "1.0" encoding = "utf-8"?>         

Вот исходный код:

  #include  #include  #include  #include  #include  #include  char configReceive [6] [80] =  {""};//парсинг xml без ParsingXMLFile (char * filename) {char * docname;  xmlDocPtr doc;  xmlNodePtr cur;  xmlChar * uri;  char config [6] [80] = {"значение1", "значение2", "значение3", "значение4", "значение5", "значение6"};  int count = 0;  int count1 = 0;  docname = имя файла;  doc = xmlParseFile (имя документа);  cur = xmlDocGetRootElement (документ);  cur = cur-> xmlChildrenNode;  while (cur! = NULL) {если ((! xmlStrcmp (cur-> name, (const xmlChar *) "xmlConfig"))) {uri = xmlGetProp (cur, (xmlChar *) config [count ++]);  strcpy (configReceive [count1 ++], (char *) uri);  xmlFree (uri);  } cur = cur-> следующий;  } count = 0;  count1 = 0;  xmlFreeDoc (doc);}  

2

Вы можете использовать функцию stat (), чтобы получить размер файла. затем выделите буфер с помощью malloc после чтения файла с помощью fread.

код будет примерно таким:

  struct stat file_status; char  * buf = NULL; FILE * pFile; stat ("tmp.xml", & file_status); buf = (char *) malloc (file_status.st_size); pFile = fopen ("tmp.xml", "r"); fread (  buf, 1, file_status. st_size, pFile); fclose (pFile);  

Улучшите этот ответ
ответил 19 декабря ’08 в 15:41
  • Вы не должны приводить malloc () и должны проверять возвращаемые значения. Кроме того, stat () нестандартен (я имею в виду стандарт ISO C). — Nietzche-jou 19 дек. ’08 в 17:01
  • @sgm: пересмотрите код и опубликуйте его вместе с вашими изменениями и причинами их внесения. Я был бы рад проголосовать за это. — GEOCHET 19 дек. ’08, 17:02
  • Ответ правильный, но, вероятно, не то, что хотел OP 🙂 Он, вероятно, хотел проанализировать XML-файл. — bortzmeyer 20 дек. ’08, в 11:31
  • @sgm: приведение malloc неверно только в C90. Вы должны преобразовать его, чтобы он был совместим с C ++, и в C99 нет опасности, поскольку неявные объявления функций больше не являются законными. — Адам Розенфилд 21 дек. ’08 в 7:08
добавить комментарий |

Вы можете использовать функцию stat (), чтобы получить размер файла. затем выделите буфер с помощью malloc после чтения файла с помощью fread.

код будет примерно таким:

  struct stat file_status; char  * buf = NULL; FILE * pFile; stat ("tmp.xml", & file_status); buf = (char *) malloc (file_status.st_size); pFile = fopen ("tmp.xml", "r"); fread (  buf, 1, file_status.st_size, pFile); fclose (pFile);  

1

Вот полная программа, которая считывает весь XML-файл (на самом деле любой файл) в буфер. Он включает примерно столько проверок ошибок, сколько было бы полезно.

N.B. все делается в main () . Превращение его в вызываемую функцию оставлено в качестве упражнения для читателя.

(Протестировано, скомпилировано с GCC 4.3.3. Переключатели были -Wall -W --pedantic - ansi .)

Комментарии по этому поводу будут рассмотрены примерно через восемь часов.

  #include  #include   int main (int argc, char * argv []) {char * buffer; /* содержит содержимое файла.  */size_t i; /* индексация в буфер.  */size_t buffer_size; /* размер буфера.  */char * temp; /* для realloc ().  */char c; /* для чтения со входа.  */ФАЙЛ * ввод; /* наш входной поток.  */if (argc == 1) {fprintf (stderr, "Требуется аргумент имени файла.  n "); exit (EXIT_FAILURE);} else if (argc> 2) {fprintf (stderr," Ну, вы передали несколько имен файлов, но я использую только% s  n ", argv [1])  ;} if ((input = fopen (argv [1], "r")) == NULL) {fprintf (stderr, "Ошибка при открытии входного файла% s  n", argv [1]); exit (EXIT_FAILURE);  }/* Первоначальное выделение буфера */i = 0; buffer_size = BUFSIZ; if ((buffer = malloc (buffer_size)) == NULL) {fprintf (stderr, "Ошибка выделения памяти (перед чтением файла).  N")  ; fclose (input);} while ((c = fgetc (input))! = EOF) {/* При необходимости увеличить буфер. */if (i == buffer_size) {buffer_size + = BUFSIZ; if ((temp = realloc  (buffer, buffer_size)) == NULL) {fprintf (stderr, "Закончилось ядро ​​при чтении файла.  n"); fclose (input); free (buffer); exit (EXIT_FAILURE);} buffer = temp;} /* Добавить входной символ в буфер. */Buffer [i ++] = c;}/* Проверить завершение цикла из-за ошибки. */If (ferror (input)) {fprintf (stderr, "Произошла ошибка ввода файла.   n "); free (buffer); fclose (input); exit (EXIT_FAILURE);}/* Создаем буфер  добросовестная струна.  */if (i == размер_буфера) {размер_буфера + = 1;  if ((temp = realloc (buffer, buffer_size)) == NULL) {fprintf (stderr, "Закончилось ядро ​​(и нужен был только еще один байт; _;).  n");  fclose (ввод);  бесплатно (буфер);  выход (EXIT_FAILURE);  } buffer = temp;  } буфер [я] = ' 0';  помещает (буфер); /* Очистить.  */бесплатно (буфер);  fclose (ввод);  return 0;}  

Улучшите этот ответ
ответил 19 дек. ’08 в 18:09
добавить комментарий |

Вот полная программа, которая читает весь XML-файл (на самом деле любой файл), в буфер. Он включает примерно столько проверок ошибок, сколько было бы полезно.

N.B. все делается в main () . Превращение его в вызываемую функцию оставлено в качестве упражнения для читателя.

(Протестировано, скомпилировано с GCC 4.3.3. Переключатели были -Wall -W --pedantic - ansi .)

Комментарии по этому поводу будут рассмотрены примерно через восемь часов.

  #include  #include   int main (int argc, char * argv []) {char * buffer; /* содержит содержимое файла.  */size_t i; /* индексация в буфер.  */size_t buffer_size; /* размер буфера.  */char * temp; /* для realloc ().  */char c; /* для чтения со входа.  */ФАЙЛ * ввод; /* наш входной поток.  */if (argc == 1) {fprintf (stderr, "Требуется аргумент имени файла.  n "); exit (EXIT_FAILURE);} else if (argc> 2) {fprintf (stderr," Ну, вы передали несколько имен файлов, но я использую только% s  n ", argv [1])  ;} if ((input = fopen (argv [1], "r")) == NULL) {fprintf (stderr, "Ошибка при открытии входного файла% s  n", argv [1]); exit (EXIT_FAILURE);  }/* Первоначальное выделение буфера */i = 0; buffer_size = BUFSIZ; if ((buffer = malloc (buffer_size)) == NULL) {fprintf (stderr, "Ошибка выделения памяти (перед чтением файла).  N")  ; fclose (input);} while ((c = fgetc (input))! = EOF) {/* При необходимости увеличить буфер. */if (i == buffer_size) {buffer_size + = BUFSIZ; if ((temp = realloc  (buffer, buffer_size)) == NULL) {fprintf (stderr, "Закончилось ядро ​​при чтении файла.  n"); fclose (input); free (buffer); exit (EXIT_FAILURE);} buffer = temp;} /* Добавить входной символ в буфер. */Buffer [i ++] = c;}/* Проверить завершение цикла из-за ошибки. */If (ferror (input)) {fprintf (stderr, "Произошла ошибка ввода файла.   n "); free (buffer); fclose (input); exit (EXIT_FAILURE);}/* Создаем буфер  добросовестная струна.  */if (i == размер_буфера) {размер_буфера + = 1;  if ((temp = realloc (buffer, buffer_size)) == NULL) {fprintf (stderr, "Закончилось ядро ​​(и нужен был только еще один байт; _;).  n");  fclose (ввод);  бесплатно (буфер);  выход (EXIT_FAILURE);  } buffer = temp;  } буфер [я] = ' 0';  помещает (буфер); /* Очистить.  */бесплатно (буфер);  fclose (ввод);  return 0;}  

0

Я считаю, что этот вопрос касался синтаксического анализа XML, а не чтения файла, однако OP действительно должен прояснить это.
В любом случае у вас есть много примеров того, как читать файл.
Другой вариант синтаксического анализа xml в дополнительном к предложению sgm будет библиотека Expat

Улучшите этот ответ
отредактировано 23 мая ’17 в 11:53
Сообщество ♦
111 серебряный значок
ответил 21 дек. ’08 в 6:09
добавить комментарий |

Я считаю, что вопрос касался синтаксического анализа XML, а не чтения файла, однако OP действительно должен прояснить это.
В любом случае у вас есть много примеров того, как читать файл.
Еще одним вариантом синтаксического анализа xml в дополнение к предложению sgm будет библиотека Expat


0

Это может сократить количество бесполезного копирования данных. Уловка состоит в том, чтобы попросить ОС о том, что вы хотите, вместо того, чтобы делать это. Вот реализация, которую я сделал ранее:

mmap. h

  #ifndef MMAP_H # define MMAP_H # include  struct region_t {void * head;  off_t size;}; # определить OUT_OF_BOUNDS (reg, p)  (((void *) (p)  head) || ((void *) (p)> = ((reg) -> head  ) + (reg) -> size)) # определить REG_SHOW (reg)  printf ("h:% p, s:% ld (e:% p)  n", reg-> head, reg-> size, reg  -> head + reg-> size); struct region_t * do_mmap (const char * fn); # endif  

mmap.c

  #include  #include /* open lseek */# include /* open */# include /* open * /# include /* lseek */# include /* mmap */# include "mmap.h" struct region_t * do_mmap (const char * fn) {struct region_t * R =  calloc (1, sizeof (struct region_t));  если (R! = NULL) {int fd;  fd = open (fn, O_RDONLY);  если (fd! = -1) {R-> size = lseek (fd, 0, SEEK_END);  if (R-> size! = -1) {R-> head = mmap (NULL, R-> size, PROT_READ, MAP_PRIVATE, fd, 0);  если (R-> голова) {закрыть (fd); /* больше не нужен файловый деструктор.  */return R;  }/* не очищать borked (mmap,) */} close (fd); /* очистка borked (lseek, mmap,) */} free (R); /* очистка borked (open, lseek, mmap,) */} return NULL;}  

Улучшите этот ответ
ответил 21 дек. ’08 в 8:12
добавить комментарий |

Это может сократить количество бесполезного копирования данных. Уловка состоит в том, чтобы попросить ОС о том, что вы хотите, вместо того, чтобы делать это. Вот реализация, которую я сделал ранее:

mmap.h

  #ifndef MMAP_H # define MMAP_H # include  struct region_t  {пустота * голова;  off_t size;}; # определить OUT_OF_BOUNDS (reg, p)  (((void *) (p)  head) || ((void *) (p)> = ((reg) -> head  ) + (reg) -> size)) # определить REG_SHOW (reg)  printf ("h:% p, s:% ld (e:% p)  n", reg-> head, reg-> size, reg  -> head + reg-> size); struct region_t * do_mmap (const char * fn); # endif  

mmap.c

  #include  #include /* open lseek */# include /* open */# include /* open * /# include /* lseek */# include /* mmap */# include "mmap.h" struct region_t * do_mmap (const char * fn) {struct region_t * R =  calloc (1, sizeof (struct region_t));  если (R! = NULL) {int fd;  fd = open (fn, O_RDONLY);  если (fd! = -1) {R-> size = lseek (fd, 0, SEEK_END);  if (R-> size! = -1) {R-> head = mmap (NULL, R-> size, PROT_READ, MAP_PRIVATE, fd, 0);  если (R-> голова) {закрыть (fd); /* больше не нужен файл-деструктор. */return R;  }/* не очищать borked (mmap,) */} close (fd); /* очистка borked (lseek, mmap,) */} free (R); /* очистка borked (open, lseek, mmap,) */} return NULL;}  


Как форматировать файлы XML в C

  • Малый бизнес
  • |

  • Правила ведения бизнеса и работы
  • |

  • Создание названий компаний

Связанные

  • Эффективный блок-паук для WordPress
  • Как конвертировать DOC в TIFF
  • Как открыть файл блокнота с помощью Fprintf
  • Как добавить файл с помощью строки CMD
  • Расширенное руководство по Java Hibernate

С распространением информации в Интернете возникла потребность в стандартизации семантики контента. Читатели, которые хотели, чтобы контент доставлялся в определенных форматах, и те, кто хотел, чтобы конфигурации подпадали под стандартные определения данных, выиграли от использования описательных данных, встроенных в контент. XML представляет такие данные описания, заимствуя синтаксис разметки HTML, чтобы обернуть данные в «метаданные». Используя любой язык программирования, даже C, программист может распечатать отформатированную разметку XML в файл для обработки любой другой программой.

Формат файла XML

Формат файла XML в первую очередь основан на понятии «метаданные». Метаданные — это, как следует из названия, данные о данных. XML предоставляет формат тегов, который позволяет поставщикам контента «оборачивать» данные, идентифицируя теги, описывающие эти данные. Типичные примеры включают различение имени автора и содержания статьи с помощью тегов «» и «». Читатели XML анализируют эти теги и соответствующим образом форматируют данные. Читатели RSS, например, используют определенную схему тегов XML для нормализации структурирования контента для простой и универсальной доставки через стандартные программы чтения RSS.

Запись файла на C

Чтобы создать правильно отформатированный файл XML на C, важно понимать, как писать этот файл. Файлы XML — это по сути текстовые файлы, поэтому программист может использовать стандартные параметры ввода/вывода файлов, встроенные в язык программирования C. Как показано в следующем коде, функция «fopen» позволяет программисту создать новый XML-файл и назначить файл ссылочному указателю для манипуляций:

int main () {

ФАЙЛ * xml_file; fopen («/home/test. xml «,» w «);

}

Теги форматирования

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

FILE * xml_file; fopen («/home/test.xml», «w»);

char header [50] = » xml version = » 1.0 «encoding = » ISO-8859-1 «?> n n»; char content [150] = » Это статья, написанная Бобом «; char author [5] =» Bob «;

fwrite (header, sizeof (header [0]), sizeof (header)/sizeof (header [0] ]), xml_file); fprintf (xml_file, «»); fwrite (author, sizeof (author [0]), sizeof (автор)/sizeof (author [0]), xml_file); fprintf (xml_file , » n n»);

fprintf (xml_file, «

«); fwrite (content, sizeof (content [0]), sizeof (content )/sizeof (content [0]), xml_file); fprintf (xml_file, «

«);

Чтение XML-файла

Поскольку XML-файл теперь соответствует типичному формату XML-файла, информацию можно читать по тегам. Фактически, данные можно анализировать так, чтобы теги никогда не отображались, а вместо этого информация отображалась на экране как обычная статья или другой блок текста. Правильное форматирование файла XML позволяет программисту разрабатывать стандартизированные программы на любом языке, включая C, для анализа файлов XML.

Ссылки

  • W3Schools.com: просмотр файлов XML
  • Cprogramming.com: Учебное пособие по вводу/выводу файлов C

Writer Bio

GS Джексон специализируется на темах, связанных с литературой, компьютерами и технологиями. Он имеет степень бакалавра искусств по английскому языку и информатике Университета Южного Иллинойса в Эдвардсвилле..

Похожие статьи

Импорт Блокнота в C ++

Как использовать Div с WordPress

Как сделать Ярлыки для хранения

Как записать таблицу данных в файл CSV

Как встроить документ Word на веб-сайт

Как убедиться, что ваша копия в социальных сетях хорошо написана

Как экспортировать списки адресов из Word в Excel

Как создать кнопку автосохранения в Visual Basic

Преобразование файла Canon MOI

Эффективный паук Блок для WordPress

Как конвертировать DOC в TIFF

Как открыть файл блокнота с помощью Fprintf

Самые популярные

  • 1 Импорт Блокнота в C ++
  • 2 Как использовать Div с WordPress
  • 3 Как сделать метки для хранения
  • 4 Как записать таблицу данных в файл CSV
Оцените статью
logicle.ru
Добавить комментарий