文件读写与XML
QDomDocument读取和编辑xml文件
QDomDocument读取和编辑xml⽂件Qt中⼏种操作xml的⽅式流⽅式sax⽅式dom⽅式初学时,我常常采⽤流⽅式读取xml,该⽅式简单直观,容易理解。
之后遇到了需要修改xml并重新写回的情况,流⽅式就显得捉襟见肘了。
sax⽅式接触不多,从来没有在实际⽣产中使⽤过。
dom⽅式概念复杂,对于个⼈来说,⽂档也不是很清晰,导致我⼀直对这个⽅式不甚了解,最近下定决⼼好好研究⼀番,也算是⼤致清楚了个中“套路”,在此记录,以便今后查阅。
注意:如果你对QDomDocument没有任何了解,则不适合阅读此⽂章。
如果你在使⽤QDomDocumentde的过程中产⽣了疑惑,则此⽂可能对你产⽣帮助。
如有疏漏,还望指正。
QDomNode ? QDomElemet? QDomAttr?QDomText?初见QDomDocument时,我被这些东西搞得⼀头雾⽔。
直到我看到了某博客中这样⼀段话:QDom前缀的都是代表节点类型。
所以有,QDomElement代表⼀个Element节点,⽽QDomText代表⼀个Text节点。
QDomNode 类可以存储任意类型的节点。
如果想进⼀步处理⼀个节点,⾸先必须把它转化为正确的数据类型。
QDomNode调⽤toElement()以把它转化成QDomElement,然后调⽤tagName()来获得元素的标签名称。
如果节点不是Element类型,那么toElement()函数就返回⼀个空QDomElement对象和⼀个空标签。
我们对xml操作,⽆⾮对节点⽂本,节点属性进⾏操作,因此,我着重在这个基础上整理⼀下。
QDomNode 兼容所有节点类型。
这⾥只讨论QDomNode为QDomElemet的情况;此时读者⼼⾥⼀惊,难道,还有不是的情况?当然有!QDomNode QDomElemet举个简单例⼦你看!有如下xml<bookstore category="xml"><book category="CHILDREN"><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><!-- asdasd--><book category="WEB"><title>Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book><test>hello</test></bookstore>有如下代码:code 01QDomElement root = doc.documentElement();QDomNode node= root.firstChild();qDebug() << root.attributeNode("category").value();while(!node.isNull()){qDebug() << "xx";node = node.nextSibling();}结果会输出⼏个xx呢?代码做出如下更改code 02QDomElement root = doc.documentElement();QDomElement node= root.firstChildElement();qDebug() << root.attributeNode("category").value();while(!node.isNull()){qDebug() << "xx";node = node.nextSiblingElement();}结果会输出⼏个xx呢?答案分别是4和3!:smirk: :smirk:结论:注释是QDomNode⽽不是QDomElement到这⾥,⼤家应该就能明⽩两者的区别了。
android读写文件权限流程
Android读写文件权限流程概述在A nd ro id开发中,应用程序需要获取特定的权限以便能够读取和写入设备上的文件。
本文将介绍An dr oi d中读写文件权限的流程,帮助开发者了解如何正确处理文件访问权限相关的问题。
为什么需要文件权限A n dr oi d系统为了保护用户的隐私和数据安全,对应用程序的文件访问进行了限制。
如果应用程序想要读取或写入设备上的文件,必须首先获取相应的权限。
否则,在没有权限的情况下进行文件操作将会引发安全异常。
文件读取权限步骤1:在A n d r o i dM a n i f e s t.x m l中声明权限要读取设备上的文件,首先需要在应用的清单文件(A nd ro id Ma ni fe st.xm l)中声明文件读取权限。
可以使用以下代码将读取权限添加到清单文件中:<u se s-p e rm is si on an dr oid:na me="an dr oi d.p e rm is si on.R EA D_E X TE RN AL_ S T OR AG E"/>这个权限允许应用程序读取外部存储(如S D卡)上的文件。
步骤2:检查权限在代码中进行文件读取操作前,需要先检查应用是否已经获得了文件读取权限。
可以使用以下代码来检查权限:i f(C on te xt Co mp at.c he ck Se lf Pe rm iss i on(c on te xt,M ani f es t.p e r mi ss io n.RE AD_EX T ER NA L_ST OR AG E)!=Pa ck ag eM an ag er.P ER MI SS I O N_G RA NT ED){//没有读取权限,请求权限}e ls e{//已经有读取权限,进行文件读取操作}步骤3:请求权限如果在步骤2中检查到没有读取权限,应该向用户请求获取该权限。
OpenCV FileStorage类读写XML或YML文件
OpenCV FileStorage类读写XML/YML文件在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XML文件分别使用函数cvLoad()和cvSave()。
在2.0以后的OpenCV转为支持C++,这一举措大大减少了代码量以及编程时需要考虑的细节。
新版本的OpenCV的C++接口中,imwrite()和imread()只能保存整数数据,且需要以图像格式。
当需要保存浮点数据或者XML/YML文件时,之前的C语言接口cvSave()函数已经在C++接口中被删除,代替它的是FileStorage类。
这个类非常的方便,封装了很多数据结构的细节,编程的时候可以根据统一的接口对数据结构进行保存。
1. FileStorage类写XML/YML文件•新建一个FileStorage对象,以FileStorage::WRITE的方式打开一个文件。
•使用<< 操作对该文件进行操作。
•释放该对象,对文件进行关闭。
例子如下:FileStorage fs("test.yml", FileStorage::WRITE);fs << "frameCount" << 5;time_t rawtime; time(&rawtime);fs << "calibrationDate" << asctime(localtime(&rawtime));Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1); //又一种Mat初始化方式Mat distCoeffs = (Mat_<double>(5,1) << 0.1, 0.01, -0.001, 0, 0);fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;//features为一个大小为3的向量,其中每个元素由随机数x,y和大小为8的uchar数组组成fs << "features" << "[";for( int i = 0; i < 3; i++ ){int x = rand() % 640;int y = rand() % 480;uchar lbp = rand() % 256;fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";for( int j = 0; j < 8; j++ )fs << ((lbp >> j) & 1);fs << "]" << "}";}fs << "]";fs.release();2. FileStorage类读XML/YML文件FileStorage对存储内容在内存中是以层次的节点组成的,每个节点类型为FileNode,FileNode可以使单个的数值、数组或者一系列FileNode的集合。
xml基本写法和dtdschema的用法,JAVA读写XML
xml基本写法和dtdschema的⽤法,JAVA读写XML1. 标记语⾔ 标记语⾔,是⼀种⽂本(Text)以及⽂本相关的其他信息结合起来,展现出关于⽂档结构和数据处理细节的电脑⽂字编码.当今⼴泛使⽤的标记语⾔是超⽂本标记语⾔(Hyper Text Markup Language,HTML)和可扩展标记语⾔(eXtensible Markup Language,XML). 标记语⾔⼴泛应⽤于⽹页和⽹络应⽤程序.1) 超⽂本标记语⾔HTML(Hyper Text Markup Language)写法格式: <a href="link.html">link</a>关注数据的展⽰与⽤户体验标记是固定的,不可扩展(如<a></a>表⽰超连接)2) 可扩展的标记语⾔XML(eXtensible Markup Language)写法格式:同html样式<a>link</a>仅关注数据本⾝标记可扩展,可⾃定义3) Xml 和 Html语⾔由同⼀种⽗语⾔SGML(Standard Generalized Markup language,标准通⽤标记语⾔)发展出来.4)解析器专业解析器(⽐如:XML SPY 专⽤于解析XML⽂件)浏览器MyEclipse5)W3C(World Wide Web Consortium)W3C:开源的语⾔协会,万维⽹联盟(World Wide Web Consortium)HTML 和 XML 都是W3C制定的语⾔规则官⽹:学习⽹站:2.xml语法规则2.1 xml的声明:xml的声明必须写在⽂件第⼀⾏Encoding(字符集)属性可以省略,默认的字符集是utf-8例⼦:1<?xml version="1.0" encoding="UTF-8"?>2<书>3<武侠⼩说 isbn="1001">4<书名>天龙⼋部</书名>5<作者>⾦庸</作者>6<价格>50</价格>7<简介>⼀本好书</简介>8</武侠⼩说>9<计算机>10<书名>疯狂java</书名>11<作者>李刚</作者>12<价格>50</价格>13<简介>⼀本好书</简介>14</计算机>15</书>常见错误写法:1) "?"和xml之间不能有空格2) 声明必须顶头写,不能有空⾏或空格(⽤FireFox浏览器打开)3) 等号左右不要多写空格(java程序员的习惯)浏览器不会报错,但是在xml解析时会出问题2.2 标记1)诸如<书名></书名>,这样格式的被称为标记2)标记必须成对出现3)标记包含开始标记和结束标记<书名>天龙⼋部</书名>注意:标记⼤⼩写敏感2.3元素(Element)1) 元素: 元素= 标记 + 其中内容 ,如<书名>天龙⼋部</书名>2) 根元素: 最外层的元素 (如 <书></书>)3) 叶⼦元素: 最⾥层(没有⼦元素的)的元素 (如,<书名></书名>,<价格></价格>)4) 空元素: 没有内容的元素叫空元素,⽐如:<a></a> ,<br></br>,可以简写为<a/> <br/>5) 元素必须遵循的语法规则a. 所有的标记都必须有结束b.开始标记和结束标记必须成对出现c.元素必须正确嵌套<a><b>c</b></a> (正确)<a><b>c</a></b> (错误)d.标记的⼤⼩写敏感Hello 和 hello不是同⼀个标记e.有且只能有⼀个根元素2.4 实体引⽤(转义字符)1) ⼩于号(<) : less then --> <2) ⼤于号(>) : great than --> >3) And符号(&) : &4) 双引号 ( ") : "5) 单引号( ') : '注意这些转义字符都是以&开头,以 ; 结尾例如:想给天龙⼋部加上书名号<<天龙⼋部>><?xml version="1.0" encoding="UTF-8"?><书><武侠⼩说 isbn="1001"><书名><<天龙⼋部>></书名><作者>⾦庸</作者><价格>50</价格><简介>⼀本好书</简介></武侠⼩说></书>2.5属性(定义在开始标记中的键值对)1)格式: 属性="属性值"如<武侠⼩说 isbn="1234"></武侠⼩说>isbn是武侠⼩说的属性,值是12342)要求:属性必须有值属性值必须⽤引号引起来,单引号或双引号都可以,但必须⼀致2.6 CDATA 类型的数据:特殊标签1) 格式: <![CDATA[⽂本内容]]>2) 特殊标签中的实体引⽤都被忽略,所有内容被当成⼀整块⽂本数据对待例如<书><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><![CDATA[⼀本好书,没有<<笑傲江湖>>好看]]></简介></武侠⼩说></书>2.8 注释(xml和html相同)1)格式: <!-- 这是⼀段注释 -->2) 编译器将忽略注释3) Html和xml注释⽅式相同例⼦:1<?xml version="1.0" encoding="UTF-8"?>2<书>3<!-- 这是⼀段注释 -->4<武侠⼩说 isbn="1001">5<书名><<天龙⼋部>></书名>6<作者>⾦庸</作者>7<价格>50</价格>8<简介>⼀本好书</简介>9</武侠⼩说>10</书>2.8 规则⼩结1) 必须有唯⼀的根元素2) xml标记⼤⼩写敏感3) 标记必须配对出现,有开始有结束4) 元素必须被正确嵌套5) 属性必须有值,值必须⽤引号引起来6) 如果遵循全部上述规则,称作well-formed⽂件(格式良好的xml⽂件) 2.9 使⽤XML⽂件描述数据的例⼦1) 早期属性⽂件描述数据的⽅式url = jdbd:oracle:thin@192.168.0.205:1521:dbsiddbUser = openlabdbPwd = open1232) 现在使⽤xml表⽰⽅式<?xml version="1.0" encoding="UTF-8"?><书><!-- 这是⼀段注释 --><武侠⼩说 isbn="1001"><书名><<天龙⼋部>></书名><作者>⾦庸</作者><价格>50</价格><简介>⼀本好书</简介></武侠⼩说></书>3. DTD/Schema1) DTD/Schema:⽤来规范XML的标记规则2)有效的xml⽂件(valid xml file) = 格式良好的xml⽂件 + 有DTD或Schema规则 + 遵循DTD或Schema规则3.1 DTD/Schema的作⽤⾏业交换数据时要求xml⽂件格式相同,所以需要⼤家遵守规范的xml⽂件格式,⽐如两份xml⽂件要有相同的元素嵌套关系,相同的属性定义,相同的元素顺序,元素出现相同次数等3.2⽂档类型定义DTD(Document Type Difinition)1) DTD⽂档⽤来定义XML⽂件的格式,约束XML⽂件中的标记规则2) DTD类型PUBLIC(⾏业共⽤的)SYSTEM(⼩范围⾃定义的)3.2.1 DTD中的定义规则必须列出所有节点,⼀个都不能少1)元素"*"星号表⽰可以出现0-n次"+"加号表⽰可以出现1-n次"|" 表⽰或(只能出现⼀个)如(phone|mobile)表⽰固话或⼿机⼆选⼀"?"问号: 表⽰出现0或1此#PCDATA 表⽰字符串2)属性:定义在开始标记中的键值对dtd 规则_属性1) <!ATTLIST 标记名称属性名称属性类型>2) isbn CDATA #REQUIRED: 表⽰isbn属性是必须的3) isbn CDATA #IMPLIED: 表⽰isbn属性不是必须的4) hot CDATA"false" :表⽰hot默认值是false例⼦3.2.1⾸先是dtd⽂件book.dtd<!ELEMENT 书 (武侠⼩说, br)*><!ELEMENT 武侠⼩说 (书名,作者+,价格,简介)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)><!ELEMENT 价格 (#PCDATA)><!ELEMENT 简介 (#PCDATA)><!ELEMENT br EMPTY><!ATTLIST 武侠⼩说 isbn CDATA #REQUIREDlang CDATA #IMPLIED><!ATTLIST 书名 hot CDATA #IMPLIED>在XML中使⽤<?xml version="1.0"?><!DOCTYPE 书 SYSTEM "book.dtd"><书><武侠⼩说 isbn="1234" lang="zh"><书名 hot="false"><<天龙⼋部>></书名><作者>⾦庸</作者><作者>古龙</作者><价格>45</价格><简介>⼀本好书</简介></武侠⼩说><br></br><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><!-- 这是⼀段注释 --><![CDATA[⼀本好书,没有<<笑傲江湖>>好看CDATA中的所有特殊字符都不解释(原样显⽰)]]></简介></武侠⼩说><br></br></书>3.3 Schema ,DTD的升级版与DTD的区别1)命名空间(NameSpace)XML⽂件允许⾃定义标记,所以可能出现来⾃不同源DTD或Schema⽂件的同名标记,为了区分这些标记,就需要使⽤命名空间.命名空间的⽬的是有效的区分来⾃不同DTD的相同标记⽐如xml中⽂件中使⽤了命名空间区分开"表格"和"桌则":<html:table><line><column>这是⼀个表格</column></line></html;table><product:table><type>coff table</type><product:table>2) 因为DTD⽆法解决命名冲突,所以出现Schema,它是DTD 的替代者,dtd和Schema的功能都是描述xml结构的3) Schema使⽤xml语法实现(Schema本⾝就是xml⽂件)因为⽤于规范和描述xml⽂件的定义⽂件(schema)本⾝也是xml⽂件,所也xml也被称为⾃描述的语⾔4) Schema ⽂件的扩展名xds: XML Schema Difinition(简称XSD,遵循W3C标准)5) Schema中的名词:复杂元素(有⼦元素的元素)简单元素(叶⼦元素)例⼦:email.xsd<?xml version="1.0" encoding="UTF-8"?><schema xmlns="/2001/XMLSchema" targetNamespace="/email" xmlns:tns="/email" elementFormDefault="qualified"> <element name="email"><complexType><sequence><element name="from" type="string"/><element name="to" type="string"/><element name="subject" type="string"/><element name="body" type="string"/></sequence></complexType></element></schema>被规范的⽂件email.xml<?xml version="1.0" encoding="UTF-8"?><tns:email xmlns:tns="/email" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/email email.xsd "><tns:from>赵敏</tns:from><tns:to>张⽆忌</tns:to><tns:subject>HIHI</tns:subject><tns:body>看泰坦尼克号</tns:body></tns:email>3.4 根据DTD或者Schema来写xml⽂件的⽅法在MyEclipse中右键New --> xml (Basic Templates) -->输⼊⽂件名-->next-->选择是DTD还是Schema4. java API 解析XML⽂件(读xml⽂件)1) Java 与xml有很多共同点(⽐如跨平台,与⼚商⽆关),⽬前位置java对xml的解析较其他语⾔更完善2) 两种解析⽅式:DOM(Document Object Model ⽂档对象模型)关键字:树(Document)优点: 把xml⽂件在内存中构造树形结构,可以遍历和修改节点缺点: 如果⽂件⽐较⼤,内存有压⼒,解析的时间会⽐较长SAX(Simple API for Xml基于XML的简单API)关键字:流(Stream)把xml⽂件作为输⼊流,触发标记开始,内容开始,标记结束等动作优点:解析可以⽴即开始,速度快,没有内存压⼒缺点:不能对节点做修改3) JDOM/DOM4J : ⽬前市场上常⽤的两种解析XML⽂件的API dom4j-1.6.1.jar 结合了DOM和SAX两种解析⽅式的优点DOM4j解析xml⽂件步骤1) 创建项⽬XMLDemo2) 加⼊dom4j的jar包(dom4j-1.6-1.jar)3) 将要解析的xml⽂件放在路径src/下4) 新建ReadXMLDemo.java4-1)构造document对象SAXReader reader = new SAXReader();Document doc = reader.read(file);4-2)取根元素:Element root = doc.getRootElement();4-3)常⽤⽅法Element elmt;elmt.elements("标记名称"):取出所有指定标记名称的元素elmt.element("标记名称"):取出第⼀个指定标记名称元素elmt.elementText("标记名称"):取elmt指定名字的⼦元素elmt.getText();取当前元素的内容Iterator it = elmt.elementsIterator("标记名称") 返回⼀个Iterator String 属性值 = elmt.attattributeValue("属性名")例⼦:ReadBookdemo源代码package day1;import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;/*** 读⼊book.xml⽂件,取出数据并打印* @author soft01**/public class ReadBookdemo {public static void main(String[] args) {readBook("book.xml");}/*** 读⼊指定的xml⽂件,取出数据并打印* @param string*/private static void readBook(String filename) {//1..读⼊指定的⽂件,构造Document对象File file = new File(filename);SAXReader reader = new SAXReader();//XML⽂件解析器try {Document doc = reader.read(file);//解析器开始解析xml⽂件//2.获得根元素Element root = doc.getRootElement();//3.递归搜索⼦元素/* List<Element> list = root.elements("武侠⼩说");//迭代武侠⼩说的元素集合Iterator<Element> it = list.iterator(); */Iterator<Element> it = root.elementIterator("武侠⼩说");while(it.hasNext()){Element bookElmt = it.next(); //bookEmlt是武侠⼩说元素//取武侠⼩说的⼦元素System.out.println(bookElmt.elementText("书名"));//取⼦元素书名的内容 List<Element> authorList = bookElmt.elements("作者");for (Element element : authorList) {//打印作者元素内容System.out.println(element.getText());}System.out.println(bookElmt.elementText("价格"));System.out.println(bookElmt.elementText("简介"));//取武侠⼩说的属性String isbnValue = bookElmt.attributeValue("isbn");//取武侠⼩说的 lang元素String langValue = bookElmt.attributeValue("lang");System.out.println("isbn="+isbnValue);System.out.println("lang="+langValue);//取⼦元素中的属性Element nameElmt = bookElmt.element("书名");System.out.println(nameElmt.attributeValue("hot"));System.out.println("-----------------");}} catch (DocumentException e) {e.printStackTrace();}}}book.xml如下<?xml version="1.0"?><书><武侠⼩说 isbn="1234" lang="zh"><书名 hot="false"><<天龙⼋部>></书名><作者>⾦庸</作者><作者>古龙</作者><价格>45</价格><简介>⼀本好书</简介></武侠⼩说><br></br><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><!-- 这是⼀段注释 --><![CDATA[⼀本好书,没有<<笑傲江湖>>好看CDATA中的所有特殊字符都不解释(原样显⽰)]]></简介></武侠⼩说><br></br></书>5 DOM4j API解析XML⽂件(⽣成)1)常⽤API⽅法:给元素增加⼦元素: elmt.addElement("标记名称");给元素增加属性: elmt.addAttribute("属性名","属性值");给叶⼦元素设值: elmt.setText("元素值");例如:要⽣成以下xml⽂件<book isbn="1001" catalog = "科幻"><name>阿⾥波特</name><author>罗林</author><price>60</price><year>2005</year></book>步骤:1.构造空的Document2.构造根元素3.递归构造⼦元素4.输出WriteBookDemo源代码package day1;import java.io.*;import org.dom4j.*;import org.dom4j.io.*;/*** 利⽤DOM4J写出xml⽂件* @author soft01**/public class WriteBookDemo {static String [][] data={{"1001", "科幻", "阿⾥波特", "罗林","60", "2005","en"},{"1002", "迷幻", "⼩波特", "罗4林","60", "2005","zh"},{"1003", "⽞幻", "中波特", "罗3林","60", "2005","en"},{"1004", "奇幻", "⼤波特", "罗2林","60", "2005","zh"}};public static void main(String[] args) {writeBook("mybook.xml");}/*** 把书的数据⽣成到指定名字的xml⽂件中* @param filename*/public static void writeBook(String filename){// 1.构造空的DocumentDocument doc = DocumentHelper.createDocument();// 2.构造根元素Element rootElmt = doc.addElement("booklist");// 3.递归构造⼦元素for(String[] book:data){Element bookElmt = rootElmt.addElement("book");//book 元素增加属性bookElmt.addAttribute("isbn", book[0]);bookElmt.addAttribute("catalog", book[1]);Element nameElmt = bookElmt.addElement("name");nameElmt.setText(book[2]);//给name 加属性nameElmt.addAttribute("lang", book[6]);Element authorElmt = bookElmt.addElement("author");authorElmt.setText(book[3]);Element priceElmt = bookElmt.addElement("price");priceElmt.setText(book[4]);Element yearElmt = bookElmt.addElement("year");yearElmt.setText(book[5]);}// 4.输出outputXml(doc,filename);}public static void outputXml(Document doc,String filename){try {//定义输出流的⽬的地FileWriter fw = new FileWriter(filename);//定义输出格式和字符集OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");//定义⽤于输出xml⽂件的XMLWriter对象XMLWriter xmlWriter = new XMLWriter(fw,format);xmlWriter.write(doc);xmlWriter.close();} catch (IOException e) {e.printStackTrace();}}}注意:运⾏程序⽣成的mybooks.xmlpackage day1;不⾃动装载,需要刷新⼀下程序运⾏通过后,在项⽬上点击右键"refreash"(或F5)如果是从别的⼯作区导⼊的项⽬,需要去别的⼯作区⽬录下找⽣成的XML⽂件6XPath(w3c的标准)1) XPath:在XML⽂件中查找或定位信息的语⾔,相当于SQL中的 selectXPath 可以通过元素/属性/值来定位或导航2) 节点(Node):相当于xml⽂件中的元素3) 指定条件定位元素的⽅式例⼦:package day1;import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;/*** 测试XPath的功能* @author soft01**/public class XPathDemo {public static void main(String[] args) {findBook("mybook.xml");}public static void findBook(String filename){SAXReader reader = new SAXReader();try {//获得⽂档对象Document doc = reader.read(new File(filename));Node node =doc.selectSingleNode("/booklist");//查找所有的catalog="奇幻"的书2//String sql = "book[@catalog ='奇幻']";//价格>50的书//String sql = "book[price>50]";//作者等于罗林的书,并且价格⼤于50//String sql ="book[author='罗林' and price>50]";//价格⼤于50,且语⾔是zhString sql = "book[price>50 and name[@lang='zh']]"; List<Element> books = node.selectNodes(sql);for(Element e:books){System.out.println(e.getStringValue());}} catch (DocumentException e) {e.printStackTrace();}}}。
qt读写XML资料[DOM方式]
qt读写XML资料[DOM方式]我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取。
根据常用的操作,我简单的把对XML的操作分为以下几类:1 首先对XML文件进行操作,打开文件。
这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成。
TopoDataReader::TopoDataReader(const wstring&filePath):_filePath(filePath),_qDomDoc("mydocument"),_qFile(QString::fromStdWString(fileP ath)){if (!_qFile.open(QIODevice::ReadOnly)){return;}if (!_qDomDoc.setContent(&_qFile)){_qFile.close();return;}}2 读取XML文件中的节点内容假设XML文件格式如下(1)<switchs><switch snmpip=211.87.235.136 newwork=front></switch></switchs>(2)<ip>211.87.235.136</ip>对于第一种情况,采用如下方法:QDomElement docElem = _qDomDoc.documentElement();QDomNode nodeswitch=docElem.elementsByTagName("switch ");//红色的为标签名QDomElement elemnodeswitch=nodeswitch.toElement();string snmpip=qPrintable(elemnodeswitch.attribute("snmpip"));//network的也是如此方法获取对于第二种情况,采用如下方法:直接调用text() API就可以了string ip=qPrintable(elementnodeip.text());但是,假设文件中有多个同样的节点,如下<a><b></b><b></b></a>这样用elementsByTagName("b")返回的就是一个childNodes()而不是一个单独的node了。
简单读取properties文件和xml文件两种方法
因为web工程上的连接数据库属性,需要不断改动。
可以把常改动的属性值列入properties文件,或者xml文件操作数据库连接时,直接进行读取文件,增加许多方便性以下是两种读取文件的工具类和properties,xml文件模板 ,还有其方法的测试结果方法一:读取properties文件jdbc.properties 模板代码1.jdbc.driverClassName=com.mysql.jdbc.Driver2.jdbc.url=jdbc\:mysql\://localhost\:3306/jiqimao?useUnicode\=true&characterEncoding\=GBKername=jiqimao4.jdbc.password=jiqimaoRpropertiesUtils.javaJava代码1.package utils;2.3.4.import java.io.IOException;5.import java.io.InputStream;6.import java.util.Properties;7.8./**9. * 描述:读取properties配置文件10. * @author 齐继超11. *12. */13.public class RpropertiesUtils {14.15. /**16. * 配置文件名称,注意文件请放到Source Folder根目录下17. */18. private static String fileName = "jdbc.properties";19.20. /**21. * 描述:根据key获取所对应的value值22. * @param key23. * @return24. * 作者:齐继超25. * 时间:Nov 25, 201026. */27. public static String get(String key){28. return get(fileName,key);29. }30.31.32. /**33. * 描述:进行读取properties配置文件34. * @param fileName35. * @param key36. * @return37. * 作者:齐继超38. * 时间:Nov 25, 201039. */40. public static String get(String fileName,String key){41.42. //根据当前执行线程返回该线程的上下文 ClassLoader43. ClassLoader classLoader = Thread.currentThread().getContextClassLoader();44. String value = "";45. try {46. //加载类获取源,读入输入流47. InputStream in = classLoader.getResource(fileName).openStream();48.49. //定义个持久的属性集50. Properties properties = new Properties();51.52. //从输入流读取属性列表53. properties.load(in);54.55. //用指定的key获取属性列表中的属性值56. value = properties.getProperty(key);57. } catch (IOException e) {58. e.printStackTrace();59. throw new RuntimeException("读取配置文件出错");60. }61. return value;62. }63.64.65.66.67.}测试读取properties文件Java代码1.package Test;2.3.import utils.RpropertiesUtils;4.5.public class TestProperties{6. public static void main(String[] args) {7.8. //测试读取properties文件9. System.out.println(RpropertiesUtils.get("jdbc.url"));10. //输出结果"jdbc:mysql://localhost:3306/jiqimao?useUnicode=true&characterE ncoding=GBK"11.12. }13.}方法二:读取xml文件jdbc.xml 模板Xml代码1.<?xml version="1.0"encoding="utf-8"?>2.<!DOCTYPE properties SYSTEM "/dtd/properties.dtd">3.<properties version="1.0">4.<comment>xml</comment>5.<entry key="driverClassName">com.mysql.jdbc.Driver</entry>6.<entry key="url">jdbc:mysql://localhost:3306/jiqimao?useUnicode=true&characterEncoding=GBK</entry>7.<entry key="username">jiqimao</entry>8.<entry key="password">jiqimao</entry>9.</properties>Rxmlutils.java代码Java代码1.package utils;2.3.import java.io.File;4.import java.io.FileInputStream;5.import java.io.IOException;6.import java.util.HashMap;7.import java.util.Map;8.import java.util.Properties;9.10./**11. * 描述:用properties类读写xml文件12. * @author 齐继超13. *14.*/15.public class RxmlUtils {16.17. /**18. * 定义xml文件的路径19. */20. private static String fileName = "final/jdbc.xml";21.22.23. /**24. * 描述:根据key取出对应value值25. * @param key26. * @return27. * 作者:齐继超28. * 时间:Nov 26, 201029. */30. public static String get(String key){31. return get(fileName,key);32. }33.34.35.36. /**37. * 描述:getValue方法的重载38. * @return39. * 作者:齐继超40. * 时间:Nov 26, 201041. */42. public static String get(String fileName,String key){43.44. //给定路径名来创建一个新 File 实例。
如何优化代码的XML数据处理
如何优化代码的XML数据处理XML(可扩展标记语言)是一种使用标签来描述和结构化数据的通用格式。
在软件开发中,处理XML数据是非常常见的任务之一。
优化XML数据处理代码可以帮助提高代码的性能、可读性和可维护性。
下面我们将讨论一些常见的优化技巧。
1.使用适当的解析器:在处理XML数据时,我们可以使用不同的解析器。
常见的解析器有DOM(文档对象模型)、SAX(简单API for XML)和StAX(流式XML API)。
DOM解析器加载整个XML文档到内存中,适用于小型文档,但对于大型文档可能导致内存问题。
SAX解析器基于事件驱动模型,逐行读取文档,适用于大型文档,但代码可能会比较复杂。
StAX解析器提供了一种流式处理XML文档的方式,同时兼具DOM和SAX解析器的优点,适合于大型文档且较易于使用。
选择适当的解析器可以根据实际需求和性能要求进行优化。
2.使用缓存:在多次处理相同的XML数据时,我们可以考虑使用缓存来提高性能。
将已解析的XML数据缓存在内存中,可以避免每次读取和解析XML文件,从而减少IO操作和CPU开销。
在对XML数据进行更新操作时,我们需要注意及时更新缓存以避免数据一致性问题。
3.使用XPath查询:XPath是一种用于在XML文档中定位节点的语言。
使用XPath查询可以帮助简化代码,提高查询性能。
相比于遍历整个XML文档来查找节点,使用XPath可以直接定位到目标节点,减少遍历次数,提高效率。
4.避免频繁的字符串拼接:在处理XML数据时,我们经常需要拼接字符串来构建XML结构。
频繁的字符串拼接会导致内存分配和拷贝的开销增加。
为了避免这个问题,我们可以使用StringBuilder类来进行高效的字符串操作。
5.使用线程池:在处理大量XML数据时,可以考虑使用线程池来并行处理任务,以提高处理效率。
将XML数据分成多个任务,每个任务由一个线程来处理,可以充分利用多核处理器,并行处理不同部分的数据。
c#中txtxmljson文件的读写操作
c#中txtxmljson⽂件的读写操作⼀、txt⽂件c#中主要可以通过以下三种⽅式进⾏读写操作,注意都需要引⼊System.IO命名空间1.使⽤File类读写⽂件//读取⽂件,把每⼀个⾏⽂本读取成⼀个字符串,返回⼀个字符串的数组string[] array = File.ReadAllLines(“⽂本路径”)//通过字符串数组形式写⼊⽂件File.WriteAllLines("⽂本路径",new string[]{"第⼀⾏的内容","第⼆⾏的内容","第三⾏的内容"})//读取⽂件,把所有⽂本读取成⼀个字符串并返回string s = File.ReadAllText(“⽂本路径”)//通过字符串形式写⼊⽂件File.WriteAllText("⽂本路径", "xx xxxx")//读取⽂件,该⽅法可以读取每个字节故可以处理所有类型的⽂件byte[] byteArray = File.ReadAllBytes("⽂件路径")//通过给定字节数组写⼊⽂件File.WriteAllBytes("⽂件路径", byteArray)2.使⽤FileStream读写⽂件public enum FileMode{//创建⼀个新的⽂件如果该⽂件已存在会引发异常。
CreateNew = 1,//创建⼀个新的⽂件如果该⽂件已存在会覆盖它Create = 2,//打开现有⽂件Open = 3,//打开⼀个⽂件,如果不存在创建⼀个新的⽂件OpenOrCreate = 4}//将⽂件1数据读到⽂件2FileStream readStream = new FileStream("⽂件路径1", FileMode.Open)FileStream writeStream = new FileStream("⽂件路径2", FileMode.Create)//在while循环中持续从原始⽂件读取字节块并存⼊缓存数组中,再从缓存数组读到⽬标⽂件中byte[] data = new byte[count]while (true){int length = readStream.Read(data, 0, data.Length);//将流数据读⼊data数组if (length == 0){//读取结束break;}else{for (int i = 0; i < length; i++){Console.Write(data[i] + "");}writeStream.Write(data, 0, length)}}//NOTE : 最后别忘了把流关闭,(浪费可耻=。
XML格式文件的应用与打开方法
XML格式文件的应用与打开方法一、什么是xml格式文件XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是一种用于标记电子文件结构和传输数据的标记语言。
XML文件使用自定义标签来描述数据的结构和含义,可以被用于在不同系统之间进行数据交换和共享。
XML文件可以被解析和处理,使得数据能够被有效地存储、传输和展示。
XML被广泛应用于Web开发、数据交换、配置文件等领域。
二、XML格式文件的应用1. Web开发XML(可扩展标记语言)是用于存储和传输数据的标准标记语言,它与HTML一起被广泛用于创建动态和交互式的网页。
在网页开发中,XML常被用于存储配置信息,如网站的元数据、页面的布局和样式等。
此外,XML还用于在不同系统之间进行数据交换,使得数据能在不同的应用程序和平台上共享和交互。
由于其结构化、灵活性和跨平台性,XML在数据存储和传输领域发挥着不可或缺的作用。
在网页开发中,XML有诸多优势,使得它在数据存储和传输方面成为理想的选择。
首先,XML的结构化特性使得数据易于理解和解析,这对于在不同系统间进行数据交换非常关键。
其次,XML的跨平台性使得数据可以在不同的应用程序和操作系统上共享和交互。
此外,XML还具有灵活性,可以轻松地表示复杂的数据结构,并支持自定义标记,以适应特定应用的需求。
在网页开发中,利用这些优势,XML可以用于存储配置信息、实现数据驱动的动态内容、以及与其他系统进行数据交换等。
通过合理地使用XML,可以提高网页的可维护性、可扩展性和交互性,为创建高性能的网站提供有力支持。
2. 数据交换XML的跨平台性和标准化特性,使其成为不同系统之间进行数据交换的理想选择。
在Web服务中,XML被广泛用于传输数据,使得不同的应用程序能够通过统一的格式进行数据交换。
它能够清晰地表示数据的结构和含义,使得不同系统能够准确解析和解读数据。
此外,XML还可以在不同数据库之间进行数据转换,实现数据的共享和集成。
c#读写XML文件
System.Xml命名空间包含了一些最重要的XML类,其中最主要的类是和XML文档的读写操作相关的类。这些类中包括4个与读相关的类以及2个与写相关的类。它们分别是:XmlReader、XmlTextReader、 XmlValidatingReader、XmlNodeReader、XmlWriter以及 XmlTextWriter。本文将重点介绍这些类,因为它们是最基本也是最重要的类。
XmlNode类是一个非常重要的类,它代表了XML文档中的某个节点。该节点可以是XML文档的根节点,这样它就代表整个XML文档了。它是许多很有用的类的基类,这些类包括插入节点的类、删除节点的类、替换节点的类以及在XML文档中完成导航功能的类。同时,XmlNode类还为程序员提供了获取双亲节点、子节点、最后一个子节点、节点名称以及节点类型等的属性。它的三个最主要的子类包括: XmlDocument、XmlDataDocument以及XmlDocumentFragment。XmlDocument类代表了一个XML文档,它提供了载入和保存XML文档的方法和属性。这些方法包括了Load、LoadXml和Save等。同时,它还提供了添加特性(Attributes)、说明(Comments)、空间(Spaces)、元素(Elements)和新节点(New Nodes)等XML项的功能。XmlDocumentFragment类代表了一部分XML文档,它能被用来添加到其他的XML文档中。 XmlDataDocument类可以让程序员更好地完成和中的数据集对象之间的互操作。
using System;
using System.Xml;
namespace ReadXml
{
class Class1
{
Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON。。。
Qt读写三种⽂件,QSettings读ini配置⽂件,QJsonDocument读JSON。
第⼀种INI配置⽂件.ini ⽂件是Initialization File的缩写,即初始化⽂件。
除了windows现在很多其他操作系统下⾯的应⽤软件也有.ini⽂件,⽤来配置应⽤软件以实现不同⽤户的要求。
⼀般不⽤直接编辑这些.ini⽂件,应⽤程序的图形界⾯即可操作以实现相同的功能。
它可以⽤来存放软件信息,注册表信息等。
读INI⽂件INI⽂件内容如下:[conn]ip=127.0.0.1port=8080databaseversion=QSQLITEdatabasename=studentusername=YYCpassword=rootqreadini.h⽂件内容如下:#ifndef QREADINI_H#define QREADINI_H#include<QSettings>#define DATACONFIG QReadIni::getInstance()->getIniConfig()typedef struct IniConfig{QString ip; //IP地址QString port; //端⼝QString dataBaseVersion; //数据库版本QString dataBaseName; //数据库名称QString userName; //⽤户名QString passWord; //密码}IniConfig;class QReadIni{public:static QReadIni*getInstance();void readIni();const IniConfig &getIniConfig();private:QReadIni();IniConfig iniConfig;static QReadIni*instance;};#endif// QREADINI_Hqreadini.cpp⽂件内容如下:#include "qreadini.h"QReadIni*QReadIni::instance = NULL;QReadIni *QReadIni::getInstance(){if(instance == NULL){instance = new QReadIni();}return instance;}QReadIni::QReadIni(){this->readIni();}void QReadIni::readIni(){QSettings * configIniRead = new QSettings("config.ini",QSettings::IniFormat);//初始化读取Ini⽂件对象 iniConfig.ip = configIniRead->value("conn/ip").toString(); //IP地址iniConfig.port = configIniRead->value("conn/port").toString(); //端⼝iniConfig.dataBaseVersion = configIniRead->value("conn/databaseversion").toString();//数据库版本iniConfig.dataBaseName = configIniRead->value("conn/databasename").toString(); //数据库名称 erName = configIniRead->value("conn/username").toString(); //⽤户名iniConfig.passWord = configIniRead->value("conn/password").toString(); //密码delete configIniRead;}const IniConfig &QReadIni::getIniConfig(){return iniConfig;}写ini⽂件#include <QtCore/QCoreApplication>#include <QSettings>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);//Qt中使⽤QSettings类读写ini⽂件//QSettings构造函数的第⼀个参数是ini⽂件的路径,第⼆个参数表⽰针对ini⽂件,第三个参数可以缺省QSettings *configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat);//向ini⽂件中写⼊内容,setValue函数的两个参数是键值对//向ini⽂件的第⼀个节写⼊内容,ip节下的第⼀个参数configIniWrite->setValue("/ip/first", "192.168.0.1");//向ini⽂件的第⼀个节写⼊内容,ip节下的第⼆个参数configIniWrite->setValue("ip/second", "127.0.0.1");//向ini⽂件的第⼆个节写⼊内容,port节下的第⼀个参数configIniWrite->setValue("port/open", "2222");//写⼊完成后删除指针delete configIniWrite;return a.exec();}第⼆种JSON⽂件"conn": {"ip": "127.0.0.1","port": "8080","databaseversion": "QSQLITE","databasename": "student","username": "YYC","password": "root"}}qreadjson.h⽂件内容如下#ifndef QREADJSON_H#define QREADJSON_H#include <QString>#include <QFile>#include <QIODevice>#include <QDomNodeList>#include <QJsonDocument>#include <QJsonObject>#define JSONCONFIG QReadJson::getInstance()->getJsonConfig() typedef struct JsonConfig{QString ip; //IP地址QString port; //端⼝QString dataBaseVersion; //数据库版本QString dataBaseName; //数据库名称QString userName; //⽤户名QString passWord; //密码}JsonConfig;class QReadJson{public:static QReadJson * getInstance();bool readJson();const JsonConfig &getJsonConfig();private:QReadJson();static QReadJson * instance;JsonConfig jsonConfig;};#endif// QREADJSON_Hqreadjson.cpp内容如下:#include"qreadjson.h"QReadJson * QReadJson::instance = NULL;QReadJson *QReadJson::getInstance(){if(NULL == instance){instance = new QReadJson();return instance;}QReadJson::QReadJson(){this->readJson();}bool QReadJson::readJson(){QString strJson;QFile *file=new QFile("config.json");if(file->open(QIODevice::ReadOnly | QIODevice::Text)){strJson = file->readAll();file->close();}else{return false;}file->close();QJsonDocument jsonDom = QJsonDocument::fromJson(strJson.toUtf8()); QJsonObject jsonObject = jsonDom.object();QJsonValue jsonValue = jsonObject.value(QString("conn"));QJsonObject objectItem = jsonValue.toObject();jsonConfig.ip = objectItem["ip"].toString();jsonConfig.port = objectItem["port"].toString();jsonConfig.dataBaseVersion = objectItem["databaseversion"].toString(); jsonConfig.dataBaseName = objectItem["databasename"].toString();erName = objectItem["username"].toString();jsonConfig.passWord = objectItem["password"].toString();delete file;return true;}const JsonConfig &QReadJson::getJsonConfig(){return jsonConfig;}第三种是读取xml⽂件:<?xml version="1.0" encoding="UTF-8"?>-<data>-<database><ip>127.0.0.1</ip><port>8080</port><databaseversion>QSQLITE</databaseversion><databasename>student.db</databasename><username>root</username><password>123</password></database>qreadxml.h⽂件内容如下:#ifndef QREADXML_H#define QREADXML_H#include<QString>#include<QtXml>#include<QFile>#include<QIODevice>#include<QDomNodeList>#define XMLCONFIG QReadXml::getInstance()->getXmlConfig() typedef struct XmlConfig{QString ip; //IP地址QString port; //端⼝QString dataBaseVersion; //数据库版本QString dataBaseName; //数据库名称QString userName; //⽤户名QString passWord; //密码}XmlConfig;class QReadXml{public:static QReadXml * getInstance();bool readXML();const XmlConfig &getXmlConfig();private:QReadXml();XmlConfig xmlConfig;static QReadXml * instance;};#endif// QREADXML_Hqreadxml.cpp⽂件如下#include "qreadxml.h"QReadXml *QReadXml::instance = NULL;QReadXml *QReadXml::getInstance(){if(NULL == instance){instance = new QReadXml();}return instance;}QReadXml::QReadXml(){this->readXML();}bool QReadXml::readXML(){int countData = 0;QDomDocument dom;QFile *file=new QFile("config.xml");if(file->open(QIODevice::ReadOnly)){if(!dom.setContent(file)) //将该xml⽂件导⼊到dom中{file->close();return false;}}else{return false;}file->close();QDomElement docElem = dom.documentElement(); //返回根元素QDomNode node = docElem.firstChild(); //返回根节点的第⼀个⼦节点while(!node.isNull()) //如果节点不为空{if(node.isElement()) //如果节点是元素{QDomElement element=node.toElement();//将其转化为元素QDomNodeList list=element.childNodes();//取出该元素的所有⼦节点放到list中 //将⼦节点元素全部取出来for(int i = 0; i < list.count(); i ++){QDomNode domNode = list.at(i);if(domNode.isElement()){//取出我们所要的数据switch(i){case0:xmlConfig.ip = domNode.toElement().text();break;case1:xmlConfig.port = domNode.toElement().text();break;case2:xmlConfig.dataBaseVersion = domNode.toElement().text();break;case3:xmlConfig.dataBaseName = domNode.toElement().text();break;case4:erName = domNode.toElement().text();break;case5:xmlConfig.passWord = domNode.toElement().text();break;}}}}countData++;node = node.nextSibling(); //下⼀个兄弟节点}return countData > 0 ? true : false;}const XmlConfig &QReadXml::getXmlConfig(){return xmlConfig;}原⽂:。
c++xml的读写代码
c++xml的读写代码在C++ 中,你可以使用库来读写XML 文件。
常见的库有RapidXML、TinyXML 和pugixml。
以下是一个使用pugixml 的简单示例来读写XML 文件的代码:首先,你需要下载并安装pugixml 库。
然后,你可以按照以下步骤创建一个简单的C++ 程序:```cpp#include <iostream>#include <pugixml.hpp>int main() {// 创建一个XML 文档pugi::xml_document doc;// 添加根节点pugi::xml_node root = doc.append_child("root");// 添加子节点pugi::xml_node child = root.append_child("child");child.append_child(pugi::node_pcdata).set_value("Hello, XML!");// 保存XML 到文件doc.save_file("example.xml");// 从文件加载XMLpugi::xml_document loadedDoc;pugi::xml_parse_result result = loadedDoc.load_file("example.xml");if (result) {std::cout << "XML file loaded successfully." << std::endl;// 获取根节点pugi::xml_node loadedRoot = loadedDoc.child("root");// 遍历子节点for (pugi::xml_node childNode = loadedRoot.child("child"); childNode; childNode = childNode.next_sibling("child")) {std::cout << "Child content: " << childNode.child_value() << std::endl;}} else {std::cout << "Failed to load XML file. Error description: " << result.description() <<std::endl;}return 0;}```上述代码中,pugixml 被用来创建、修改和解析XML。
JavaScript中的文件读写操作
JavaScript中的文件读写操作JavaScript作为一种脚本语言,广泛用于前端开发和后端开发的Web应用程序中。
除了能够与用户交互,操作DOM元素,处理表单数据等,它还具备操作文件的能力。
本文将介绍JavaScript中的文件读写操作,帮助读者了解如何在JavaScript中实现读取和写入文件。
1. 读取文件在JavaScript中,我们可以使用FileReader对象来读取文件。
以下是读取文件的基本步骤:1. 创建一个FileReader对象:可以使用构造函数`new FileReader()`来创建一个FileReader对象。
2. 使用FileReader的`readAsText()`方法读取文件内容:通过调用FileReader对象的`readAsText()`方法,将文件内容读取为文本。
3. 注册load事件监听器:使用FileReader对象的`onload`事件监听器来处理文件读取完成后的操作。
下面是一个简单的示例:```javascript// 创建FileReader对象var reader = new FileReader();// 注册load事件监听器reader.onload = function(e) {// 文件读取完成后的操作var contents = e.target.result;console.log(contents);}// 读取文件reader.readAsText(file); // file是一个File类型的对象,代表要读取的文件```上述示例中,通过调用`readAsText()`方法将文件内容读取为文本,并在`onload`事件中打印文件内容。
2. 写入文件除了读取文件,JavaScript也可以实现将数据写入文件。
但是需要注意的是,JavaScript本身是运行在浏览器环境中的,无法直接操作本地文件系统。
在Web应用程序中,我们可以借助服务器端的接口来实现文件写入操作。
XML读写操作
XML读写操作小结我们知道对XML的操作有两种方法,即DOM方式和SAX方式。
二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。
Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来处理。
项目中涉及便签的增删改查,对应于XML文件中相应标记的读、写和修改,下面分别介绍:1. 创建节点,将其写入XML文件,主要操作包括:1).创建根节点:QDomElement root = doc.documentElement("rootName " );2).创建元素节点:QDomElement element = doc.createElement("nodeName");3).添加元素节点到根节点:root. appendChild(element);4).创建元素文本:QDomText nodeText=doc.createTextNode("text");5).添加元素文本到元素节点:element. appendChild(nodeText);在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:QDomDocument doc;instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");doc.appendChild(instruction);QDomElement root = doc.createElement("Notes");doc.appendChild(root);QDomElement note = doc.createElement("note");root.appendChild(note);QDomElement no = doc.createElement("no");note.appendChild(no);......QDomText no_text = doc.createTextNode("001");......则得到一个便签节点,将其保存到test.xml文件中,代码如下:QFile file("test.xml");if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return ;QTextStream out(&file);out.setCodec("UTF-8");doc.save(out,4,QDomNode::EncodingFromTextStream);file.close();则test.xml文件:<?xml version="1.0" encoding="UTF-8"?><Notes><note><no>001</no><name>2010-05-10(13:53:24)</name><content>A meeting!</content><font>Script MT Bold</font><fontSize>16</fontSize><color> #00ffff</color><weight>0</weight><fontItalic>true</fontItalic><fontUnderline>true</fontUnderline></note></Notes>上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。
C#读取和写入XML文件
C#读取和写⼊XML⽂件关于xml是属于⼀个⽐较重要的东西,在平时开发的过程中,这块内容最主要的是要掌握XML内容的读取和写⼊操作。
⼀.什么是XML?XML 指可扩展标记语⾔(EXtensible Markup Language)XML 是⼀种标记语⾔,很类似HTMLXML 的设计宗旨是传输数据,⽽⾮显⽰数据XML 标签没有被预定义,您需要⾃⾏定义标签XML 被设计为具有⾃我描述性XML 是W3C 的推荐标准⼆.XML语法:1.⼀个XML包含以下⼏部分内容:⽂档声明,元素,属性,注释,CDATA(特殊字符),处理指令2.最简单的声明格式 <?xml version="1.0" ?> ⽤encoding属性声明⽂档的编码 <?xml version="1.0" encoding="UTF-8" ?> ⽤standalone属性说明⽂档是否独⽴ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>三.XML⽂件的读取:xml⽂件内容:<?xml version="1.0" encoding="utf-8"?><library id="30"><BOOK id="20"><name>⾼等数学</name><name1>⼤学英语</name1></BOOK></library>读取XML内容:static void Main(string[] args){//将XML⽂件加载进来XDocument document = XDocument.Load("D:\\123.xml");//获取到XML的根元素进⾏操作XElement root= document.Root;XElement ele= root.Element("BOOK");//获取name标签的值XElement shuxing= ele.Element("name");Console.WriteLine(shuxing.Value);//获取根元素下的所有⼦元素IEnumerable<XElement> enumerable = root.Elements();foreach (XElement item in enumerable){foreach (XElement item1 in item.Elements()){Console.WriteLine(); //输出 name name1}Console.WriteLine(item.Attribute("id").Value); //输出20}Console.ReadKey();}写⼊XML内容:static void Main(string[] args){//获取根节点对象XDocument document = new XDocument();XElement root = new XElement("School");XElement book = new XElement("BOOK");book.SetElementValue("name", "⾼等数学");book.SetElementValue("name1", "⼤学英语");root.Add(book);root.Save("d:\\123.xml");Console.ReadKey();}注:这⾥介绍的两种简单的读取写⼊xml⽂件,更多⾼级的⽤法可以参考:有道云笔记xml部分内容 。
LinuxShell脚本读写XML文件
LinuxShell脚本读写XML⽂件在Linux下如何⽤Shell脚本读写XML?现有⼀个config.xml<?xml version="1.0" encoding="UTF-8"?><config><server-ip>192.168.1.45</server-ip><server-port>1209</server-port><repository-temp-path>/home/john</repository-temp-path></config>需要修改⾥⾯的"server-ip", "server-port" and "import-path",⽤Shell脚本的参数$1,$2,$3来写⼊。
思路1:⽤sed实现⾸先想到的就是⽤sed正则匹配替换实现,写了⼀个shell脚本,是这样的:#!/bin/shif [ $# -ne 3 ];thenecho "usage: argument 1:IP_Address 2:Server_PORT 3:Temp_PATH"exit 1fiIP=$1PORT=$2DIRT=$3echo "Change values in config.xml..."sed "s/<server-ip>.*<\/server-ip>/<server-ip>${IP}<\/server-ip>/;s/<server-port>.*<\/server-port>/<server-port>${PORT}<\/server-port>/;s/<repository-temp-path>.*<\/repository-temp-path>/<repository-temp-path>${DIRT}<\/repository-temp-path>/" config.xml > config.xmlecho "Done."测试下来调⽤$ ./abc.sh 192.168.1.6 9909 \\/home\\/abc"是可以的,但环境变量不⾏,例如:$ ./abc.sh 192.168.1.6 9909 $HOME\\/abc",因为⾸先环境变量被解析了,所以存在反斜杠转义字符和sed替换冲突的问题。
linux下读写xml文件
linux下读写xml⽂件linux下读写xml⽂件说明:由于linux开发板有些系统配置⽂件是xml⽂件,所以需要简单的修改xml中的元素内容,于是在⽹上找开源的xml读写库。
mini-xml⼀个简单的xml读写库,优点是⼩,⽅便。
下载地址:此⽂章基于Mini-XML 3.1版本具体移植步骤如下:1、将下载后的压缩包在linux下执⾏"tar -zxvf mxml-3.1.tar.gz"命令进⾏解压缩;2、进⼊mxml-3.1⽬录下执⾏"./configure --prefix=/home/ulinux/mxml-3.1/local --host=arm-linux";3、第2步执⾏完成后会在mxml-3.1⽬录下⽣产⼀个Makefile⽂件,执⾏make,再执⾏make install即可;4、在/home/ulinux/mxml-3.1/local⽬录下即有lib、include和share三个⽂件夹,相关⽂件即在其中;注意:a.如果是想在32位linux开发板上使⽤mxml,则需要修改Makefile,并且需要编译环境下有交叉编译⼯具链;否则使⽤默认环境及编译⼯具只能⽣成当前环境下可⽤的库⽂件,切记切记;b.Makefile中按照⽬标环境,修改AR、CC、RANLIB即可;c.交叉编译⼯具所在路径需要导⼊到环境变量中;具体测试代码如下(linux虚拟机下测试)int main(void){int fd = 0;char ip[]="192.168.1.1";mxml_node_t *tree = NULL, *node = NULL;fd = open("./mobileap_cfg.xml", O_RDWR | O_CREAT,0666);if(fd < 0){printf("open mobileap_cfg.xml error");}/*MXML_OPAQUE_CALLBACK选项,直接读原始字符串,不按照空格来区分元素*/tree = mxmlLoadFd(NULL, fd, MXML_OPAQUE_CALLBACK);if(tree == NULL){printf("mxmlLoadFd error");}node = mxmlFindElement(tree, tree, "APIPAddr",NULL, NULL,MXML_DESCEND);if(node == NULL){printf("mxmlFindElement error");}if(strcmp(node->child->value.opaque, ip) != 0){int ret = mxmlSetOpaque(node->child, ip);lseek(fd,0,SEEK_SET);ret = mxmlSaveFd(tree,fd, MXML_NO_CALLBACK);printf("ip set complete, ret=%d", ret);}close(fd);mxmlDelete(tree);}友情链接:a.mxml中⽂⽂档:mobileap_cfg.xml⽂件内容如下:<?xml version="1.0"?><system xmlns:xsi="/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mobileap_cfg.xsd"><MobileAPCfg><MobileAPNatCfg><Firewall>/etc/data/mobileap_firewall.xml</Firewall><NatEntryGenericTimeout>200</NatEntryGenericTimeout><NatEntryICMPTimeout>30</NatEntryICMPTimeout><NatEntryTCPEstablishedTimeout>3600</NatEntryTCPEstablishedTimeout><NatEntryUDPTimeout>60</NatEntryUDPTimeout><DmzIP>0.0.0.0</DmzIP><EnableIPSECVpnPassthrough>1</EnableIPSECVpnPassthrough><EnablePPTPVpnPassthrough>1</EnablePPTPVpnPassthrough><EnableL2TPVpnPassthrough>1</EnableL2TPVpnPassthrough><EnableSOCKSv5Proxy>0</EnableSOCKSv5Proxy><SOCKSv5ProxyConfFile>/etc/data/qti_socksv5_conf.xml</SOCKSv5ProxyConfFile> <SOCKSv5ProxyAuthFile>/etc/data/qti_socksv5_auth.xml</SOCKSv5ProxyAuthFile> <EnableWebserverWWANAccess>0</EnableWebserverWWANAccess><NATType>SYM</NATType><ALGCfg><EnableRTSPAlg>0</EnableRTSPAlg><EnableSIPAlg>1</EnableSIPAlg></ALGCfg><Initial_Pkt_Limit>0</Initial_Pkt_Limit></MobileAPNatCfg><MobileAPLanCfg><EnableIPV4>1</EnableIPV4><EnableIPV6>1</EnableIPV6><GatewayURL></GatewayURL><WlanMode>AP</WlanMode><WlanRestartDelay>1</WlanRestartDelay><MobileAPSTABridgeEnable>0</MobileAPSTABridgeEnable><HostAPDCfg>/etc/misc/wifi/hostapd.conf</HostAPDCfg><HostAPDEntropy>/data/entropy_file</HostAPDEntropy><STAModeHostAPDCfg>/etc/misc/wifi/sta_mode_hostapd.conf</STAModeHostAPDCfg> <APIPAddr>192.168.0.50</APIPAddr><SubNetMask>255.255.255.0</SubNetMask><EnableDHCPServer>1</EnableDHCPServer><DHCPCfg><StartIP>192.168.0.90</StartIP><EndIP>192.168.0.130</EndIP><LeaseTime>43200</LeaseTime></DHCPCfg><IPPassthroughCfg><IPPassthroughEnable>0</IPPassthroughEnable><IPPassthroughDeviceType>-1</IPPassthroughDeviceType><IPPassthroughHostName>0</IPPassthroughHostName><IPPassthroughMacAddr>0</IPPassthroughMacAddr></IPPassthroughCfg><GuestAPCfg><HostAPDCfg>/etc/misc/wifi/hostapd-wlan1.conf</HostAPDCfg><HostAPDEntropy>/data/entropy_file1</HostAPDEntropy><AccessProfile>INTERNETONLY</AccessProfile></GuestAPCfg><GuestAP2Cfg><HostAPDCfg>/etc/misc/wifi/hostapd-wlan2.conf</HostAPDCfg><HostAPDEntropy>/data/entropy_file2</HostAPDEntropy><AccessProfile>INTERNETONLY</AccessProfile></GuestAP2Cfg><GuestAP3Cfg><HostAPDCfg>/etc/misc/wifi/hostapd-wlan3.conf</HostAPDCfg><HostAPDEntropy>/data/entropy_file3</HostAPDEntropy><AccessProfile>INTERNETONLY</AccessProfile></GuestAP3Cfg><StationModeCfg><SupplicantCfg>/etc/misc/wifi/wpa_supplicant.conf</SupplicantCfg><STAModeConnType>1</STAModeConnType><StaticIPAddr>0</StaticIPAddr><StaticConfigDNSAddr>0</StaticConfigDNSAddr><StaticConfigGWAddr>0</StaticConfigGWAddr><StaticConfigNetMask>0</StaticConfigNetMask></StationModeCfg><AlwaysOnWLAN>0</AlwaysOnWLAN></MobileAPLanCfg><MobileAPWanCfg><EriConfig>/data/mobileap_eri_config.bin</EriConfig><FirstPreferredBackhaul>bt-pan</FirstPreferredBackhaul><SecondPreferredBackhaul>eth</SecondPreferredBackhaul><ThirdPreferredBackhaul>usb_cradle</ThirdPreferredBackhaul><FourthPreferredBackhaul>wlan</FourthPreferredBackhaul><FifthPreferredBackhaul>wwan</FifthPreferredBackhaul><Profile>1</Profile><AutoConnect>0</AutoConnect><Roaming>1</Roaming><TECH>ANY</TECH><V4_UMTS_PROFILE_INDEX>15</V4_UMTS_PROFILE_INDEX><V4_CDMA_PROFILE_INDEX>15</V4_CDMA_PROFILE_INDEX><V6_UMTS_PROFILE_INDEX>15</V6_UMTS_PROFILE_INDEX><V6_CDMA_PROFILE_INDEX>15</V6_CDMA_PROFILE_INDEX><DefaultSIPServerConfigType>FQDN</DefaultSIPServerConfigType><DefaultSIPServerConfig></DefaultSIPServerConfig><PrefixDelegation>0</PrefixDelegation></MobileAPWanCfg><MobileAPSrvcCfg><UPnP>0</UPnP><DLNA>0</DLNA><MDNS>0</MDNS><DLNAWhitelistingAllow>0</DLNAWhitelistingAllow></MobileAPSrvcCfg><DDNSCfg><EnableDDNS>0</EnableDDNS><DDNSServer></DDNSServer><DDNSProtocol>dyndns2</DDNSProtocol><DDNSLogin>user_defined</DDNSLogin><DDNSPassword>user_defined</DDNSPassword><DDNSHostname></DDNSHostname><DDNSTimeout>60</DDNSTimeout></DDNSCfg><TinyProxyCfg><EnableTinyProxy>0</EnableTinyProxy></TinyProxyCfg><Dhcpv6Cfg><EnableDhcpv6Dns>0</EnableDhcpv6Dns></Dhcpv6Cfg><MobileAPBootUpCfg><MobileAPEnableAtBootup>0</MobileAPEnableAtBootup><WLANEnableAtBootup>0</WLANEnableAtBootup><DataPathOpt>0</DataPathOpt></MobileAPBootUpCfg><Cradle><CradleMode>2</CradleMode></Cradle><EthBackhaul><EthBackhaulMode>0</EthBackhaulMode></EthBackhaul><PacketStats><PacketStatsCfg>0</PacketStatsCfg></PacketStats><vlan /><L2TPConfig><enable>0</enable><MTU_enable>0</MTU_enable><TCP_MSS_enable>0</TCP_MSS_enable></L2TPConfig><GSBConfig><GSBBootUpcfg>0</GSBBootUpcfg><num_of_entries>0</num_of_entries></GSBConfig><DunDongleMode>0</DunDongleMode><PMIPv6><EnablePMIPmode>0</EnablePMIPmode><EnablePMIPDebugmode>0</EnablePMIPDebugmode><PMIPmodeType>6</PMIPmodeType><LMAv6Address>::</LMAv6Address><LMAv4Address>0</LMAv4Address><PMIPTunnelType>6</PMIPTunnelType><PMIPV4WorkMode>0</PMIPV4WorkMode><PMIPV4SecRouterDMNPPrefix>0</PMIPV4SecRouterDMNPPrefix><PMIPV4SecRouterdmnpPrefixLen>0</PMIPV4SecRouterdmnpPrefixLen> <PMIPMobileNodeIdentifierType>0</PMIPMobileNodeIdentifierType><PMIPMobileNodeIdentifierString>-1</PMIPMobileNodeIdentifierString><PMIPServiceSelectionString>-1</PMIPServiceSelectionString></PMIPv6></MobileAPCfg></system>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件读写与XML
1、如何读写文件流
a.创建一个文件流
b.创建阅读器或者写入器
c.执行读写器
d.关闭阅读器或者写入器
e.关闭文件流
2、创建文件流读写文件
文件流是FileStream类,它主要用于读写文件中的数据,在创建一个文件流时,需要在他的构造函数中指定参数
FileStream(string Fileparth, FileMocle)
FileParth: 用于要操作的文件
FileMocle: 指定如何打开文件的模式,它是一个枚举类型
FileStream类中,枚举的不同成员
Create:用指定的名称新建一个文件,如果有文件存在,则修改旧文件
CreateNew:新建一个文件,若异常,则提示存在
Open:打开一个文件,使用这个枚举只时,指定文件必须存在,否则发生异常
OpenOrCreate:与Open类似,如果文件存在,则用指定的名称新建一个文件打开3、关闭文件流
在写入结束后一定要关闭文件流myFs.Close();
4、文件读写器
StreamWriter写入器
创建实例
StreamWriter mySw=new StreamWriter(myfs);
调用方法,将要写入的内容写入文件流
A.StreamWriter .Write(); 用于写入流(常见好的流)
B.S treamWriter.WriteLine():用于写一行数据(换行符)
C.S treamWriter.Close();用于关闭写入器
StreamReader读取器
用于读取流中的数据
A、StreamReader.ReadLine();读取一行数据,并返回字符串
B、S treamReader.ReadToEnd();从当前位置读取到末尾,返回字符串
C、S treamReader .Close();用于关闭读取器
5、文件和目录操作
File类的方法
Exists(string Parth): 用于检查指定文件是否存在,返回一个布尔值
Copy(string sourceFileParth, string DestinatioFileParth): 将指定路径的原文件的内容复制到目录文件中,如果目录文件不存在,则在指定路径中新建一个文件Move(string SourceFileName, string destFileName): 将指定文件移动到一个新的
路径
Delete(string Path): 删除指定的文件,如果指定的文件不存在,则不引发异常
Directory类的方法
Exists (string Path) : 用于检查指定文件夹在磁盘上是否存在
Move(string ScourceDirName, string destDirName ): 用于将文件或目录及其
内容移到新位置
6、XML概述
是扩展标记性语言
特点:
A、XML中用于描述数据的各个节点,可以自由扩展
B、X ML文件中的节点区分大小写
C、X ML中的每对标记常称为节点,他们是成对出现的,用来描述这个节点存储的内
容
7、XML的对象和方法
8、FreeView树形控件
FreeView 通过节点来表示数据
FreeView 的Nodes对象表示它的节点集合
FreeView 的节点对象是FreeNode。