【IT专家】从服务器解析大型XML,同时在Swift 3中使用LibXML2下载
- 格式:pdf
- 大小:404.17 KB
- 文档页数:6
libxml2实例详解最近因为资源区的一个天气预报的项目需要使用libxml2库来解析合作方提供的xml格式的文件,于是对它进行了一些研究。
下面的文章总结了网上的一些文章并结合我们自己的uconv库来进行讲解,希望能够起到抛砖引玉的作用,这样大家以后遇到类似的问题可以不用去找人请教了。
本片文章只涉及最普遍的应用,不涉及一些复杂功能如XPATH等功能。
先来说说libxml2的简介吧,libxml2是一个C语言的XML程序库,可以简单方便的提供对XML 文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。
在我们的公共库的third目录下有该库,因此不需要我们自己下载或者安装。
Libxml2中的数据类型和函数一个函数库中可能有几百种数据类型以及几千个函数,但是记住大师的话,90%的功能都是由30%的内容提供的。
对于libxml2,我认为搞懂以下的数据类型和函数就足够了。
内部字符类型xmlCharxmlChar是Libxml2中的字符类型,库中所有字符、字符串都是基于这个数据类型。
事实上它的定义是:xmlstring.htypedef unsigned char xmlChar;使用unsigned char作为内部字符格式是考虑到它能很好适应UTF-8编码,而UTF-8编码正是libxml2的内部编码,其它格式的编码要转换为这个编码才能在libxml2中使用。
还经常可以看到使用xmlChar*作为字符串类型,很多函数会返回一个动态分配内存的xmlChar*变量,使用这样的函数时记得要手动删除内存。
xmlChar相关函数如同标准c中的char类型一样,xmlChar也有动态内存分配、字符串操作等相关函数。
例如xmlMalloc是动态分配内存的函数;xmlFree是配套的释放内存函数;xmlStrcmp是字符串比较函数等等。
基本上xmlChar字符串相关函数都在xmlstring.h中定义;而动态内存分配函数在xmlmemory.h中定义。
java解析超⼤xml(1G),⼀般数据挖掘dblp.xml⽂件的解析在⽹上找了很多关于解析超⼤xml的例⼦,都说java再带的jar包中有相关的SAXparse类来解析xml,但是试过了好多次,之后还是不⾏,还有dom4j.jar等等,都不能解析太多条数的xml,⼤概超过30M,就会解析报错。
不过偶尔看到过xercesImpl.jar,sax2.jar,jaxen-1.1.1.jarimport java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import java.io.File;import org.xml.sax.SAXException;public class SAX {public static void main(String[] args) {try {SAXParserFactory factory=SAXParserFactory.newInstance();factory.setNamespaceAware(true);factory.setValidating(true);SAXParser parser=factory.newSAXParser();SAXparse p1=new SAXparse();parser.parse(new File("D:\\dblp.xml"), p1);} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} 或者import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/****/public class XMLParse {private String configName = "dblp_little.xml";private SAXReader saxReader;private Document doc;private Element root;/***/public XMLParse() {// InputStream in = Thread.currentThread().getContextClassLoader()// .getResourceAsStream(configName);saxReader = new SAXReader();try {doc = saxReader.read(configName);} catch (DocumentException e) {e.printStackTrace();}root = doc.getRootElement();}/*** get Data Type** @throws IOException*/public void getModelElement(String attribute) {FileWriter fileWriter = null;try {fileWriter = new FileWriter(attribute + ".txt");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}List list = root.elements();Element model = null;List childList = null;Element modelEle = null;Element returnModel = null;String dataType = null;StringBuffer sb = new StringBuffer();int temp = 0;for (Iterator it = list.iterator(); it.hasNext();) {model = (Element) it.next();temp++;System.out.println("temp:"+temp);childList = model.elements();for (Iterator ite = childList.iterator(); ite.hasNext();) {modelEle = (Element) ite.next();if (attribute.equals(modelEle.getName())) {dataType = modelEle.getText();dataType = dataType;if (sb.length() > 1) {sb.append(",");}sb.append(dataType);}}dataType = sb.toString();if (!"".equals(dataType)) { // 没有值的话,跳过往txt中写值try {fileWriter.write(dataType);fileWriter.write("\r\n");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}sb.delete(0, sb.length());try {fileWriter.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}try {// fileWriter.flush();fileWriter.close();System.out.println("xml解析成功,并成功写⼊到"+attribute+".txt ⽂件中!"); } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("list.size:"+list.size());}public static void main(String[] args) {// TODO Auto-generated method stubString attribute = null;XMLParse parse = new XMLParse();attribute = "author";parse.getModelElement(attribute);}}。
libxml2 使用实例libxml2是一个用于解析和操作XML文档的开源库。
本文将介绍libxml2的使用实例,包括解析XML文档、遍历文档树、查询节点等常用操作。
一、解析XML文档libxml2提供了多种解析XML文档的方式,包括从文件、字符串、缓冲区等不同来源进行解析。
1. 从文件解析XML文档使用函数xmlReadFile可以从文件中读取XML文档并解析成文档对象。
示例代码如下:```cxmlDocPtr doc;doc = xmlReadFile("example.xml", NULL, 0);```2. 从字符串解析XML文档使用函数xmlReadMemory可以从字符串中解析XML文档。
示例代码如下:```cconst char *xmlStr = "<root><name>John</name></root>";xmlDocPtr doc;doc = xmlReadMemory(xmlStr, strlen(xmlStr), NULL, NULL, 0); ```3. 从缓冲区解析XML文档使用函数xmlReadIO可以从缓冲区中解析XML文档。
示例代码如下:```cFILE *fp = fopen("example.xml", "r");xmlParserCtxtPtr ctxt;ctxt = xmlNewParserCtxt();ctxt->input = xmlNewIOInputStream(ctxt, fp, XML_CHAR_ENCODING_NONE);xmlDocPtr doc;doc = xmlCtxtReadIO(ctxt, NULL, NULL, 0);```二、遍历文档树在解析XML文档后,我们可以通过遍历文档树来获取文档中的节点信息。
LIBXML2库使用指南C++的XML编程经验――LIBXML2库使用指南写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言;2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介绍如何在windows平台下进行编程,更很少提到如何解决中文问题。
基于以上几点原因,决定写一个在Windows平台下,使用C/C++语言,应用LibXml2库来进行xml文档操作,同时使用ICONV库进行中文编码转换的文档。
其中还涉及了Makefile、XPATH等相关内容。
本文中所有的源代码在/Files/wxb_nudt/xml_src.rar。
1.下载与安装LIBXML2和ICONVLibxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能。
Libxml2的下载地址是/,完全版的库是开源的,并且带有例子程序和说明文档。
最好将这个库先下载下来,因为这样可以查看其中的文档和例子。
windows版本的的下载地址是/libxml.en.html;这个版本只提供了头文件、库文件和dll,不包含源代码、例子程序和文档。
在文本中,只需要下载libxml2库、iconv库和zlib库就行了(注意,libxml2库依赖iconv和zlib库,本文中重点关注libxml2和iconv,zlib不介绍),我使用的版本是libxml2-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。
在编程的时候,我们使用windows版本的libxml2、zlib和iconv,将其解压缩到指定文件夹,例如D:"libxml2-2.6.30.win32,D:"zlib-1.2.3.win32以及D:"iconv-1.9.2.win32。
go 解析xml的方法使用Go语言解析XML的方法XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有自我描述性且具有良好的可读性。
在Go语言中,我们可以使用内置的encoding/xml包来解析XML数据。
本文将介绍如何使用Go语言解析XML的方法,包括解析XML文件和解析XML 字符串两种方式。
一、解析XML文件要解析XML文件,我们首先需要打开文件并读取其内容。
然后,我们可以使用encoding/xml包中的Unmarshal函数将XML数据解析为Go语言中的结构体。
以下是解析XML文件的基本步骤:1. 导入encoding/xml包我们需要在Go代码中导入encoding/xml包,以便使用其中的函数和类型。
```goimport "encoding/xml"```2. 定义结构体我们需要定义一个Go语言结构体,用于存储解析后的XML数据。
结构体的字段应与XML元素和属性的名称对应。
```gotype Person struct {Name string `xml:"name"`Age int `xml:"age"`Email string `xml:"email"`}```在上面的例子中,我们定义了一个Person结构体,其中包含了name、age和email字段,分别对应XML中的name、age和email元素。
3. 打开并读取XML文件在解析XML文件之前,我们需要打开文件并读取其内容。
可以使用Go语言中的os包和ioutil包来完成这个步骤。
```gofile, err := os.Open("data.xml")if err != nil {log.Fatal(err)}defer file.Close()data, err := ioutil.ReadAll(file)if err != nil {log.Fatal(err)}```在上面的代码中,我们打开名为data.xml的XML文件,并使用ioutil包中的ReadAll函数将文件内容读取到data变量中。
c语言解析xml源码
C语言解析XML源码是一个相当复杂的任务,因为XML是一种
具有层次结构的标记语言,它需要逐级解析并处理标签、属性和文
本内容。
在C语言中,通常会使用第三方库来解析XML,比较常用
的有libxml2和expat等。
首先,我们需要使用适当的方法读取XML文件的内容,可以使
用C语言的文件操作函数来实现。
然后,我们需要逐个读取XML文
件中的标签、属性和文本内容,这就需要用到字符串处理函数和逻
辑判断。
接着,我们需要建立数据结构来存储XML文件的层次结构,通常会使用树形结构来表示XML的层次关系。
在这个过程中,我们
需要考虑如何处理XML文件中的命名空间、实体引用等特殊情况。
一般来说,使用libxml2或expat等库可以大大简化解析XML
的过程。
这些库提供了丰富的API来处理XML文件,包括读取、解析、遍历和修改XML文档等功能。
使用这些库,我们可以更方便地
实现XML文件的解析和处理,而不需要从零开始编写解析XML的代码。
在实际编写C语言解析XML的源码时,需要考虑到错误处理、
内存管理、性能优化等方面。
特别是在处理大型XML文件时,需要考虑到内存占用和解析效率的问题。
因此,在编写解析XML的源码时,需要仔细考虑各种情况,并进行充分的测试和优化。
总之,解析XML的源码编写是一个复杂而且需要细致处理的任务,需要充分理解XML的结构和规范,同时使用合适的工具和技术来简化解析过程。
希望这个回答能够帮助你更好地理解C语言解析XML源码的过程。
使⽤libxml2解析xml book.xml<?xml version="1.0" encoding="UTF-8" ?><books><book2><name id="1">c primer plus111</name><author>unknow author</author><date>unknow date</date></book2><book111111><name>c++ 21天⼊门到精通</name><author>未知作者</author><date>未知⽇期</date></book111111></books>//// Created by gxf on 2020/2/6.//#include <stdio.h>#include <string.h>#include <libxml/parser.h>//#include <libxml/tree.h>void println(char *s);typedef struct {char *name;char *author;char *date;}book;void printBook(book book1);int main() {xmlDocPtr bookDocPtr;xmlNodePtr booksNodePtr;char *bookDocName = "/Users/gxf/CLionProjects/untitled/books.xml";// libxml默认将各个节点间的空格当作⼀个节点xmlKeepBlanksDefault(0);bookDocPtr = xmlParseFile(bookDocName);if (bookDocPtr == NULL) {fprintf(stderr, "xmlReadFile fail");exit(1);}book onebook;// root nodebooksNodePtr = xmlDocGetRootElement(bookDocPtr);// book nodexmlNodePtr bookNodePtr = booksNodePtr->children;while (bookNodePtr) {// namexmlNodePtr namePtr = bookNodePtr->children;// println(xmlNodeGetContent(namePtr)); = xmlNodeGetContent(namePtr);// authorxmlNodePtr authorPtr = namePtr->next;// println(xmlNodeGetContent(authorPtr));onebook.author = xmlNodeGetContent(authorPtr);// datexmlNodePtr datePtr = authorPtr->next;// println(xmlNodeGetContent(datePtr));onebook.date = xmlNodeGetContent(datePtr);printBook(onebook);bookNodePtr = bookNodePtr->next;}return 0;}void println(char *s) {printf("%s\n", s);}void printBook(book book1) {printf("name: %s\n", );printf("author: %s\n", book1.author);printf("date: %s\n", book1.date);} cmakelist# libxml2include_directories(/usr/local/include/libxml2) link_libraries(xml2)add_executable(libxml2-demo libxml2-demo.c) 。
qt 解析xml报文的方法Qt是一种流行的跨平台应用程序开发框架,提供了丰富的功能和工具,用于开发各种类型的应用程序。
其中,XML解析是Qt框架中的一个重要功能,可以用于解析XML格式的报文数据。
本文将介绍Qt中解析XML报文的方法。
一、Qt中解析XML报文的基本概念在开始介绍Qt中的XML解析方法之前,我们先来了解一下XML 报文的基本概念。
XML是一种标记语言,用于描述结构化的数据。
XML报文由标签、属性和文本内容组成,通过标签和属性来表示数据的结构和关系,通过文本内容来存储实际的数据。
二、Qt中解析XML报文的方法Qt提供了QXmlStreamReader和QXmlStreamWriter两个类,用于解析和生成XML报文。
其中,QXmlStreamReader用于解析XML报文,而QXmlStreamWriter用于生成XML报文。
1. 使用QXmlStreamReader解析XML报文QXmlStreamReader类提供了一种流式的方式来解析XML报文。
它可以逐行读取XML报文,并提供了一系列的方法来获取当前节点的信息,如节点的名称、属性和文本内容等。
在使用QXmlStreamReader解析XML报文时,可以按照以下步骤进行操作:(1)创建QXmlStreamReader对象,并将要解析的XML报文作为输入流传入。
(2)使用readNext()方法读取XML报文的下一个节点。
(3)根据节点的类型,使用相应的方法来获取节点的信息,如name()方法获取节点的名称,attributes()方法获取节点的属性等。
(4)使用hasNext()方法判断是否还有下一个节点,如果有,则返回true,否则返回false。
(5)重复步骤2到步骤4,直到解析完整个XML报文。
下面是一个使用QXmlStreamReader解析XML报文的示例代码:```cppQXmlStreamReader reader(xmlData); // 创建QXmlStreamReader对象while (!reader.atEnd()) {reader.readNext(); // 读取下一个节点if (reader.isStartElement()) { // 判断当前节点是否是开始元素 qDebug() << "Element Name:" << (); // 输出节点名称QXmlStreamAttributes attributes = reader.attributes(); // 获取节点的属性for (int i = 0; i < attributes.size(); i++) {qDebug() << "Attribute Name:" << attributes[i].name() << "Value:" << attributes[i].value(); // 输出属性名称和值}if (reader.isCharacters()) { // 判断当前节点是否是文本内容qDebug() << "Text Content:" << reader.text(); // 输出文本内容}}}if (reader.hasError()) {qDebug() << "XML parsing error:" << reader.errorString(); // 输出解析错误信息}```2. 使用QXmlStreamWriter生成XML报文QXmlStreamWriter类提供了一种方便的方式来生成XML报文。
个人总结C语言下xml使用全集_libxml 在C语言下,libxml是一个非常强大和广泛使用的XML解析库。
它提供了一系列的API,用于解析、创建、修改和查询XML文档。
以下是我对libxml的个人总结。
首先,libxml提供了高效的XML解析功能。
它支持多种解析方式,包括DOM(文档对象模型)解析和SAX(简单API for XML)解析。
DOM解析将整个XML文档加载到内存中,形成一个树状结构,方便对XML文档进行修改和查询。
而SAX解析则是一种基于事件驱动的解析方式,逐行读取XML文档并触发相应的回调函数,适合处理大型XML文档。
其次,libxml提供了丰富的API,用于对XML文档进行操作。
它支持创建、修改和删除XML元素、属性和文本节点等操作。
同时,libxml还提供了一些高级功能,如命名空间支持、XPath查询和XInclude支持等。
XPath查询使得在XML文档中进行复杂的查询变得简单和高效,而XInclude支持可以将多个XML文档合并为一个。
此外,libxml还支持XML的验证和转换。
它可以通过DTD(文档类型定义)或XML Schema验证XML文档的合法性,并报告错误信息。
同时,libxml还提供了XML到HTML、XML到文本和XML到其他XML格式的转换功能,方便进行数据格式转换。
另外,libxml具有良好的跨平台性。
它支持在多种操作系统上运行,包括Windows、Linux和Mac OS等。
这使得开发人员可以在不同的平台上使用相同的代码和功能,提高了开发效率和代码的可移植性。
在使用libxml时,我发现它具有一些优点。
首先,它是一个开源的库,可以免费使用和修改。
其次,它的性能非常出色,能够处理大型的XML文档。
此外,libxml还具有良好的文档和示例,使得学习和使用变得更加容易。
然而,libxml也存在一些不足之处。
首先,它的API相对较为复杂,需要一定的学习成本。
libxml2剖析(3):使用教程本文整理自官方使用教程。
示例文档story.xml如下:[html]view plaincopy1.<?xml version="1.0"?>2.<story>3.<storyinfo>4.<author>John Fleck</author>5.<datewritten>June 2, 2002</datewritten>6.<keyword>example keyword</keyword>7.</storyinfo>8.<body>9.<headline>This is the headline</headline>10.<para>This is the body text.</para>11.</body>12.</story>1、解析xml文档解析文档时只需要文档名和一个函数调用,再加上错误处理。
下面代码查找keyword节点并打印节点下的文本内容,如下:[cpp]view plaincopy1.#include <stdio.h>2.#include <string.h>3.#include <stdlib.h>4.#include <libxml/xmlmemory.h>5.#include <libxml/parser.h>6.7./* 解析storyinfo节点,打印keyword节点的内容 */8.void parseStory(xmlDocPtr doc, xmlNodePtr cur){9.xmlChar* key;10.cur=cur->xmlChildrenNode;11.while(cur != NULL){12./* 找到keyword子节点 */13.if(!xmlStrcmp(cur->name, (const xmlChar *)"keyword") ){14.key = xmlNodeListGetString(doc, cur->xmlChildrenNo de, 1);15.printf("keyword: %s\n", key);16.xmlFree(key);17.}18.cur=cur->next; /* 下一个子节点 */19.}20.21.return;22.}23.24./* 解析文档 */25.static void parseDoc(char *docname){26./* 定义文档和节点指针 */27.xmlDocPtr doc;28.xmlNodePtr cur;29.30./* 进行解析,如果没成功,显示一个错误并停止 */31.doc = xmlParseFile(docname);32.if(doc == NULL){33.fprintf(stderr, "Document not parse successfully. \n");34.return;35.}36.37./* 获取文档根节点,若无内容则释放文档树并返回 */38.cur = xmlDocGetRootElement(doc);39.if(cur == NULL){40.fprintf(stderr, "empty document\n");41.xmlFreeDoc(doc);42.return;43.}44.45./* 确定根节点名是否为story,不是则返回 */46.if(xmlStrcmp(cur->name, (const xmlChar *)"story")){47.fprintf(stderr, "document of the wrong type, root node != story");48.xmlFreeDoc(doc);49.return;50.}51.52./* 遍历文档树 */53.cur = cur->xmlChildrenNode;54.while(cur != NULL){55./* 找到storyinfo子节点 */56.if(!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo") ){57.parseStory(doc, cur); /* 解析storyinfo子节点 */58.}59.cur = cur->next; /* 下一个子节点 */60.}61.62.xmlFreeDoc(doc); /* 释放文档树 */63.return;64.}65.66.int main(int argc, char **argv){67.char *docname;68.if(argc <= 1){69.printf("Usage: %s docname\n", argv[0]);70.return 0;71.}72.docname=argv[1];73.parseDoc(docname);74.return 1;75.}解析XML文档的基本流程如下:(1)定义文档指针和节点指针。
本文由我司收集整编,推荐下载,如有疑问,请与我司联系从服务器解析大型XML,同时在Swift 3中使用LibXML2下载2016/12/14 439 I have a Problem with the SAX parser from LibXML2 in Swift 3. I want something like XMLPullParser from Android in iOS. Which downloads XML from a server and while downloading it parses the Stream.
在Swift 3中,我对LibXML2中的SAX解析器有问题。
我想在iOS中使用XMLPullParser。
从服务器下载XML,同时下载它解析流。
My XML looks like this:
我的XML是这样的:
?xml version=“1.0” encoding=“UTF-8” ? ResultList id=“12345678-0” platforms=“A;B;C;D;E” Book id=“1111111111” author=“Author A” title=“Title A” price=“9.95” ... / Book id=“1111111112” author=“Author B” title=“Title B” price=“2.00” ... / Book id=“1111111113” author=“Author C” title=“Title C” price=“5.00” ... / ResultInfo bookcount=“3” / /ResultList So all the data is stored in attributes rather than child nodes.
因此所有数据都存储在属性中,而不是子节点中。
I’ve made the following class by myself mostly based by these examples: XMLPerformance, XMLPerformance-Swift and iOS-XML-Streaming
我自己制作了下面的类,主要基于这些示例:XMLPerformance、XMLPerformance- swift和ios - xml流
import Foundationclass LibXMLParser: NSObject, URLSessionDataDelegate { var url: URL? var delegate: LibXMLParserDelegate? var done = false var context: xmlParserCtxtPtr? var simpleSAXHandlerStruct: xmlSAXHandler = { var handler = xmlSAXHandler() handler.initialized = XML_SAX2_MAGIC handler.startElementNs = startElementSAX handler.endElementNs = endElementSAX handler.characters = charactersFoundSAX //handler.error = errorEncounteredSAX return handler init(url: URL) { super.init() self.url = url func parse() { self.done = false let session =。