当前位置: 首页 > 软件库 > 程序开发 > XML相关工具 >

ReadXml

xml 文件读写插件
授权协议 GPL
开发语言 C/C++
所属分类 程序开发、 XML相关工具
软件类型 开源软件
地区 国产
投 递 者 薛弘阔
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

本插件实现对xml文件的读写,此版本只实现对标准xml文档的标签,标签属性,标签值,预定义的实体引用进行处理。由C语言实现,较适合处理大型xml文档,处理速度较快。本插件遵循GPL协议。

术语

开始标签:xml中一个标签对的开始的标签。
结束标签:xml中一个标签对的结束的标签。
值内存池:专门用于存储值的内存。
行Buffer:存储读取xml文件一行内容的内存。
空白字符:本程序中只代表文本中的空格,tab键值两个非可见字符
标签名:略。
标签属性:略。
标签属性值:略。
标签值:略。
注:为叙述方便,下文中,标签名以key,标签属性以property,标签属性值以property_value,标签值以value表示。

文件

  • read_xml.h -- read_xml头文件

  • read_xml.c -- read_xml源码

  • ReadMe.md -- read_xml说明文档

  • xml.xml -- 示例xml文件

  • libread_xml.so -- 封装的linux动态库

  • read_xml.lib -- VisualStudio2015生成的windows编译动态库接口

  • read_xml.dll -- 封装的windows动态库

  • test.c --示例

处理限制

 1.文本限制

  • 单个标签自身(无论是开始标签还是结束标签)不能跨行。

  • xml文件头中xml版本和字符集信息中的空格不做处理。

  • 开始标签的第一个属性与标签名之间必须有一个或多个空白字符。

  • 值中间和结尾的空白字符键默认保留,而值开头的空白字符将被删除。

  • 标准的引用:< > & ' " 。一个引用之中不能有空白字符,否则做普通字符处理。

  • value与开始标签之间的空格或tab键值默认不存储为值的一部分,但值与结束标签之间的空格或tab键值默认作为值的一部分。

  • 不验证xml的合法性。虽然程序已经尽可能的提高容错性,但请使用者自行尽可能地保证所读写的xml符合规范,不规范的xml不保证能正确处理。

2.数值限制

  • 值内存池:5M——整个文档标签的值,每个值字符串附加一个'\0'字符。合计最大为5M。

  • 行Buffer大小:1024 byte。

  • 标签名:<=127 byte。

  • 属性名:<=63 byte。

  • 属性值:<=63 byte。

  • 标签值:理论上单个标签值的大小为值内存池大小,但也受行Buffer大小的限制。即值可以跨行,但该值的每一行字符数应<=1024个字符。

存储方法 

存储内容:标签名,属性名,属性值,值。
存储结构:伸展树,双向链表。

伸展树
存储xml内容,但不体现xml的从属结构。结点为KeyNode,以key检索元素。xml主体中所有同名标签下的所有property,property_value,value都以双向链表的形式存储在同一个KeyNode下的properties,values。
伸展树由静态全局变量LABEL_TREE管理,其中LABEL_TREE->root指向伸展树的根节点。

XML_LIST
不存储xml内容,但体现xml的从属结构。XML_LIST,以及XML_LIST中是一个双向链表,结点为XML,每个结点代表xml文本中的一个标签及其子标签整体,其子标签存储在child_list中,也是双向链表。XML_LIST自身并不存储任何xml元素,只引用自伸展树。
XML_LIST的头节点为静态全局变量XML_LIST。
此外,伸展树结点中的标签属性、值的链式存储也为双向链表。

关于存储结构的详细信息请参看read_xml.h文件。

使用方法

  • 源码编译
    源码中不涉及C99特征,因read_xml属于插件范畴,故read_xml以动态库的形式呈现,所以read_xml.c中并没有主函数,且原则上只对外提供非static修饰的函数。用户可自己编译,文档结构十分简单,只有一个.c文件和一个同名的.h文件。用户可自行对read_xml.h中的一些宏,主要是针对各种Buffer的大小进行配置。

  • 函数调用
    请参考read_xml.h文件对各个函数的说明。

  • TableConfig.xml:   <?xml version="1.0" encoding="utf-8" ?> <DataFactory Desc="TableConfig" CreateUser="" CreateDate="">   <Sql001 desc="SelectWithParm" coder="" date="">     <Sql>       <![CDATA[     

  • string strxml = "121122111222"; DataSet ds = new DataSet(); Stream stream = new MemoryStream(Encoding.Default.GetBytes(strxml)); ds.ReadXml(stream); GridView1.DataSource = ds; GridView1.DataBind(); pr

  • 上篇写了读取xml简单的方法,但是比较麻烦,所以优化了一下,通过序列化来读取配置文件. xml格式: <?xml version="1.0"?> <StatsConfigTwo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <statsDat

  • 经过测试:直接可以用 '与之相关的XML文件 ' ' ' ' EarthWare ' American ' Nuric ' Devid ' Ware ' $19.0 ' ' ' Briage ' American ' Huston ' Madanad ' Qindge ' $20.0 ' ' ' Water ' China ' XIAN ' Mrs.NINGJIN ' Ware ' $20.0 '

  • using System; using System.Xml.Linq; using System.Reflection; using System.Collections.Generic; using UnityEngine; /// <summary> /// 读取XML的方法 /// </summary> /// <typeparam name="T">读取的XML将转换成的类型</typ

  • 先 检查xml中resultMap的result标签,field和properties字段是不是写对了,有没有空格,空格是最烦的,有时候莫名其妙报错又找不出来 其次 <result field="order_total" properties="order_total"/> field是指使用sql查询时返回的结果上面的字段名字,properties才是POJO对象的字段名

  • 如题。 在csdn有的说是xml格式不正确。 后来在这里(XmlReader 读取器读取内存流 MemoryStream 的注意事项)发现:原来是对 stream 进行 write/read之后 stream.Position 没事设置为0.   转载于:https://www.cnblogs.com/nikytwo/archive/2009/03/27/1423032.html

 相关资料
  • 打开文件及文件读写 打开文件及文件读写 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 代码清单:文件读写例子 * * 这个例子演示了如何读写一个文件。 */

  • 读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。 读文件 要以读文件的模式打

  • 读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。 读文件 要以读文件的模式打

  • 问题内容: 我正在尝试更改文本文件中的某些行,而不影响其他行。这就是文本文件“ text.txt”中的内容 我的目标是更改第4行和第5行,但其余部分保持不变。 即使代码有效,我想知道是否有更好,更有效的方法?是否可以仅通过行号读取文件? 问题答案: 您没有什么可以改善的。但是您必须将所有行都写入 一个新文件 ,无论已更改还是未更改。较小的改进将是: 使用该语句; 避免将行存储在列表中; 子句中不带

  • 主要内容:C# 中的 I/O 类,FileStream 类,C#中文本文件的读取写入,二进制文件读写文件是存储在磁盘中的具有特定名称和目录路径的数据集合,当我们使用程序对文件进行读取或写入时,程序会将文件以数据流(简称流)的形式读入内存中。我们可以将流看作是通过通信路径传递的字节序列,流主要分为输入流和输出流,输入流主要用于从文件读取数据(读操作),输出流主要用于向文件中写入数据(写操作)。 C# 中的 I/O 类 System.IO 命名空间中包含了各种用于文件操作的类,例如文件的创建、删除、

  • 12.2.1 读文件 在 Go 语言中,文件使用指向 os.File 类型的指针来表示的,也叫做文件句柄。我们在前面章节使用到过标准输入 os.Stdin 和标准输出 os.Stdout,他们的类型都是 *os.File。让我们来看看下面这个程序: 示例 12.4 fileinput.go: package main import ( "bufio" "fmt" "io"

  • 问题内容: 我正在读取2个csv文件:&。 我希望能够将CSV文件与进行比较。1)如果项目名称匹配,只需更新store_inventory中的数量。2)如果new_acquisitions具有不存在的新项目,则将其添加到中。 这是我到目前为止所做的,但是效果不是很好。我在需要添加taks 1 和 2的 地方添加了注释。 任何建议或执行上述任务的代码都将非常有用!谢谢。 再次感谢任何帮助。=] 问题

  • 主要内容:read_csv(),to_csv()在《 Python Pandas读取文件》中,我们讲解了多种用 Pandas 读写文件的方法。本节我们讲解如何应用这些方法 。 我们知道,文件的读写操作属于计算机的 IO 操作,Pandas IO 操作提供了一些读取器函数,比如 pd.read_csv()、pd.read_json 等,它们都返回一个 Pandas 对象。 在 Pandas 中用于读取文本的函数有两个,分别是: read_csv(