xml
1 XML是指可扩展标记语言 全称 extensible Markup Language,是一种标记语言,类似HTML,它被设计的宗旨 是传输数据 在xml中的标签全是自己定义 的 xml是w3c组织发布的技术,目前thsg1.0 1.1 ,但是使用的都是1.0 2 XML的应用2.1 常见的应用第一种 用于系统之间传输数据的格式 例如:QQ,这种传输方式具有可读必和可维护性 第二种 用于表示生活中有关系的数据 第三种 经常用在配置文件中 可以提高系统的灵活性 3.XML的语法3.1文档声明如果想要创建一个xml,首先必须在文件里面写文档声明 <?xml version="1." encoding ="utf-8"?> version :xml的版本 encoding:xml的编码方式 standalone: xml文件是否依赖其他文件 文档声明必须要写在xml文件的第一行第一列 3.2元素(标签)(1)xml的标签有开始,必须有结束 (2)有些标签没有结束标签,可以在标签内结束 (3)xml中的标签可以嵌套,但是必须是合理的嵌套 (4)xml中只能有一个根标签,其他的标签都是这个标签的子标签 (5)xml 中的代码是区分大小写的 (6)xml 会把文件里面的空格和换行都当做内容来处理 3.3 属性(1)在thml中的标签里面有属性,在xml中也是存在属性的 (2)在xml的标签中可以有多个属性,但是每个属性都有自己的名称,每个属性的名称不可相同 (3)在xml的标签里面属性的写法 3.4 注释(1)在xml中添加注释 <!-- --> (2)在xml中注释是不可以嵌套的 3.5 CDATA区(1)把cdata区里面的内容当做普通文件显示,而不是当做标签使用 <![CDATA[内容]]> 4 XML的解析4.1XML的解析XML的解析有三种 dom解析 sax解析 pull解析 4.2 dom解析 和sax 的解析的原理(1)dom解析原理根据xml的层级层极结构会在内在中分配一处树形结构 document :代表整个文档 元素对象 属性对象 文本对象 节点对象,是上面的对象的父对象 dom解析的缺点是 如果文件过大,会造成内在溢出 dom解析的优点是 方便 实现 增加 修改 删除的操作 4.3 sax解析的原理一行一行的边读边解析 当读到相应的标签的进修,自动执行里面相应的方法 4.4 sax解析的优点是 不会造成内存溢出sax解析的缺点是 不能实现增加 修改 删除 的操作 5 pull解析的原理和代码实现5.1 pull解析就 是sax的原理sax解析需要反导文档都解析完成,不能停止 pull解析可以在某一部分停止 ,pull解析的原理也是一行一行的边读边解析 5.2 pull解析xml的代码的实现首先创建一个xml格式的文件
<?xml version="1.0" encodint="utf-8"?> <students> <student> <name>zhangsan</name> <age>20</age> </student> <student> <name>lisi</name> <age>22</age> </student> <student> <name>wangwu</name> <age>26</age> </student> </students> (2)想要使用pull解析xml,首先导入jar包 (3)代码
public static void readFile() throws XmlPullParserException,IOException { //创建pull解析器工厂 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //创建pull解析器 XmlPullParser parser = factory.newPullParser(); //创建读入文件的输入流 InputStream in = new FileInputStream("src/01.xml"); //把要解析的文件放到解析器中 parser.setInput(in,"utf-8"); //创建储存文件的List集合 List<Student> list=null; Student stu =null; int type=0; while((type=parser.getEventType())!=XmlPullParser.END_DOCUMENT) { //获取当前标签的名字 String tname = parser.getName(); switch(type) { case XmlPullParser.START_TAG: if("students".equals(tname)) { list = new ArrayList<Student>(); } else if("student".equals(tname)) { stu = new Student(); } else if("name".equals(tname)) { String sname = parser.nextText(); stu.setName(sname); } else if("age".equals(tname)) { String age = parser.nextText(); stu.setAge(age); } break; case XmlPullParser.END_TAG: if("student".equals(tname)) { list.add(stu); } break; } parser.next(); } for(Student stus :list) { System.out.println(stus); } } public static void readFile() throws XmlPullParserException,"utf-8"); //创建储存文件的List集合 List<Student> list=null; Student stu =null; int type=0; while((type=parser.getEventType())!=XmlPullParser.END_DOCUMENT) { //获取当前标签的名字 String tname = parser.getName(); switch(type) { case XmlPullParser.START_TAG: if("students".equals(tname)) { list = new ArrayList<Student>(); } else if("student".equals(tname)) { stu = new Student(); } else if("name".equals(tname)) { String sname = parser.nextText(); stu.setName(sname); } else if("age".equals(tname)) { String age = parser.nextText(); stu.setAge(age); } break; case XmlPullParser.END_TAG: if("student".equals(tname)) { list.add(stu); } break; } parser.next(); } for(Student stus :list) { System.out.println(stus); } } Student [name=zhangsan,age=20] Student [name=zsan,age=23] Student [name=lishi,age=23] Student [name=wangwu,age=29]
再把读到的集合中的学生对象再写入另一个xml文件中去
private static void writeListFiles() throws Exception { // TODO Auto-generated method stub //创建pull解析器工厂 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //创建解析器 XmlSerializer serializer = factory.newSerializer(); //创建输出路径 OutputStream out = new FileOutputStream("F: 002.xml"); serializer.setOutput(out,"utf-8"); XmlPullParser parser = factory.newPullParser(); //创建文件 的输入流 InputStream in = new FileInputStream("src/01.xml"); //把要解析的文件 添加到解析器中去 parser.setInput(in,"utf-8"); //创建存储集合 List<Student> list=null; Student stu = null; int type = 0; while((type=parser.getEventType())!=XmlPullParser.END_DOCUMENT) { //得到当前读取的标签名 String tagName = parser.getName(); //依据每次读取的标签类型来判断 switch(type) { case XmlPullParser.START_TAG: if("students".equals(tagName)) { list = new ArrayList<Student>(); }else if("student".equals(tagName)) { stu = new Student(); }else if("name".equals(tagName)) { String name =parser.nextText(); stu.setName(name); }else if("age".equals(tagName)) { String age = parser.nextText(); stu.setAge(age); } break; case XmlPullParser.END_TAG: if("student".equals(tagName)) { list.add(stu); } break; } parser.next(); } Iterator<Student> it = list.iterator(); //生成文档声明 serializer.startDocument(null,true); //生成开始标签 serializer.startTag(null,"students"); while(it.hasNext()){ Student stus= it.next(); serializer.startTag(null,"student"); //生成name agg serializer.startTag(null,"name"); serializer.text(stus.getName()); serializer.endTag(null,"name"); serializer.startTag(null,"age"); serializer.text(stus.getAge()); serializer.endTag(null,"age"); serializer.endTag(null,"student"); } serializer.endTag(null,"students"); serializer.endDocument(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |