XML可扩展标记语言
一、XML可扩展标记语言 1、概念: XML推出初衷是为了替换HTML,标签名可以直接定义,不能用数字开头 不能使用纯数字 区分大小写,后用做配置文件 封装数据 因为xml具有良好的格式,所以用途非常广泛,比如持久化存储数据 数据交换 数据配置 xml和html的区别: 1)html的标签是固定的,不能扩展。xml的标签是不固定的,可扩展的。 2)html侧重于显示的信息。xml侧重于标识信息的结构。 3)html是不区分大小写的。xml是区分大小写的。xml的语法比html更严谨。 2、组成部分 文档声明:<?xml version="1.0" encoding="utf-8"?> 必须顶行 顶格写 根标签:有且仅有一个根标签 其他标签:有开始标签 一定要有结束标签 标签属性:一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:<Student name="text"> 注解:<!-- --> //Comment注释对象 标签里的内容 egg张三:<name>张三</name> XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理 3、解析思想 DOM解析思想:Document Object Model 文档对象模型(dom4j解析) 将文档一次性 加载进内存 然后将文档各个组成部分抽取为对象 优点: 能够对文档进行增删改查 缺点:耗内存 适用于PC端 SAX解析思想:基于事件 逐行解析,一次读取一行,释放一行(sax解析、pull解析) 优点 :不占内存 适用于移动端 缺点:只能查 不能增删改 二、dom4j解析 读取xml文件步骤: 1、导入DOM4J jar包 2、创建解析器对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new FileInputStream("xml文件名.xml")); 3、获取根标签对象 Element rootElement = doc.getRootElement(); 1) rootElement.node(第几个节点);//获取单个节点对象 获取根标签下的子节点(不能获取孙子节点),空白地方也算一个子节点对象 rootElement.nodeIterator();//获取多个节点对象 2) rootElement.element("标签名");//获取第一个子标签对象 rootElement.elements();//获取所有的子标签对象 rootElement.elementIterator();//通过迭代器的方式获取所有的子标签对象 4、获取标签属性对象 Element element = rootElement.element("标签名"); Attribute attribute = element.attribute(第几个属性/"属性名"); attribute.getName();//获取属性的键 attribute.getValue();//获取属性的值 //element.attributes();获取所有的属性对象 //element.attributeIterator();通过迭代器的方式获取所有的属性对象 //element.attributeValue(第几个属性/"属性名");直接获取属性对象的值 5、获取标签内文本 List<Element> list = element.elements(); for(Element ele:list){ String text = ele.getText();//获取文本内容 System.out.println(text); } 用代码写xml文件步骤: 导入DOM4J jar包 //通过文档帮助类createdoc Documentdoc=DocumentHelper.createDocument(); //添加一个根标签 ElementrootEle=doc.addElement("students"); //添加一个子标签 Elementele=rootEle.addElement("student"); //给student标签添加一个属性 ele.addAttribute("id","9527"); //给student添加一个名字和学号标签及内容 Elementelement1=ele.addElement("sname"); element1.addText("张三"); Elementelement2=ele.addElement("sid"); element2.addText("007"); //把内存中doc写到硬盘上 OutputFormatformat1=OutputFormat.createCompactFormat(); OutputFormatformat2=OutputFormat.createPrettyPrint();//漂亮的格式 //在开发阶段利于我们调试可以使用漂亮的格式 //项目开发好之后上线,我们要调整成紧凑格式减小xml文件的体积 XMLWriterwriter=newXMLWriter(newFileOutputStream("mydoc.xml"),format2); writer.write(doc); writer.close(); 用代码修改xml文件步骤: //找到你想修改的节点 1)修改属性的值 attribute.setValue("新属性值"); 2)修改文本 element.setText("新文本"); 3)删除标签、属性 element.detach(); attribute.detach(); // 重新写入到硬盘覆盖掉原文件 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml文件名.xml")); xmlWriter.write(doc); xmlWriter.close(); 附:XPath:主要是用于xml快速获取所需的节点对象 1、导入Dom4j 的jar包 和支持xPath技术的jar包 2、使用xpath方法: List<Node> list = rootElement.selectNodes("xpath表达式"); 查询多个节点对象 Node nade = rootElement.selectSingleNode("xpath表达式"); 查询一个节点对象 3、xpath表达式 / 绝对路径 选择该标签下子标签 // 相对路径 该标签下所有标签,表示不分任何层次结构的选择元素。 * 通配符 表示匹配所有元素 [] 条件 表示选择什么条件下的元素 @ 属性 表示选择属性节点,定位一个属性名 and 关系 表示条件的与关系(等价于&&) not() 取反 text() 文本 表示选择文本内容 egg:String path = "//user[@id='2']/name"; //选出所有user标签中id="2"的user标签下的name标签 三、sax解析 sax解析有两个部分,解析器和事件处理器 解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源) 事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理 为了简化开发提供了ContentHandler的实现类DefaultHandler类 //事件处理器 publicclassMyContentHandlerextendsDefaultHandler{ //文档解析开始时调用,该方法只会调用一次 @Override publicvoidstartDocument()throwsSAXException{ super.startDocument(); } //标签开始时调用 @Override publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{ //uri:xml文档的命名空间(用不到) //localName:标签的名字(用不到) //qName:带命名空间的标签的名字(使用标签名用这个) //attributes:标签的属性集 super.startElement(uri,localName,qName,attributes); } //解析标签的内容的时候调用 @Override publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{ //ch:当前读取到的TextNode(文本节点)的字节数组 //start:字节开始的位置,为0则读取全部 //length:当前TextNode的长度 super.characters(ch,start,length); } //标签结束时调用 @Override publicvoidendElement(Stringuri,StringqName)throwsSAXException{ super.endElement(uri,qName); } //文档解析结束后调用,该方法只会调用一次 @Override publicvoidendDocument()throwsSAXException{ super.endDocument(); } } //解析器 //获取解析器工厂对象,从而获取解析器对象 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); //使用指定的DefaultHandler解析指定文件 parser.parse(new File("文件名.xml"),new MyContentHandler()); 四、pull解析 Xmlpull比Sax更简明,而且不需要扫描完整个流 步骤: //导入kxml2-2.3.0.jar xmlpull_1_1_3_4c.jar第三方jar包 //获取解析器工厂对象,从而获取解析器对象 XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance(); XmlPullParserparser=factory.newPullParser(); //关联xml文件 parser.setInput(newFileInputStream("文件名.xml"),"utf-8"); //获取事件类型 inttype=parser.getEventType(); //XmlPullParser.START_DOCUMENT; 文档开始事件0 //XmlPullParser.END_DOCUMENT; 文档结束事件1 //XmlPullParser.START_TAG; 开始标签事件2 //XmlPullParser.END_TAG; 结束标签事件3 //XmlPullParser.TEXT; 代表文本4 while(type!=XmlPullParser.END_DOCUMENT){ StringtagName=parser.getName(); switch(type){ caseXmlPullParser.START_TAG: if("标签名".equals(tagName)){ //操作(javabean) }elseif("标签名".equals(tagName)){ //... } break; caseXmlPullParser.END_TAG: if("标签名".equals(tagName)){ //操作(add) } break; } //让指针跳到下一行,重新给type赋值,不然就会死循环 type=parser.next() } //把内存中的数据序列化到硬盘上去永久保存 //获取解析器工厂对象,从而获取序列化器 XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance(); XmlSerializerserializer=factory.newSerializer(); //设置输出流关联xml文件 serializer.setOutput(newFileOutputStream("文件名.xml"),"utf-8"); //写入文档声明(文档开始) serializer.startDocument("utf-8",true);//参数二:文档是否独立 //写入开始根标签 serializer.startTag(null,"students");//参数1命名空间一般给null参数2标签名称 //写入根标签的子标签student开始标签 serializer.startTag(null,"student"); serializer.attribute(null,"id","id值");//写入属性 //写入student标签的子标签name开始标签 serializer.startTag(null,"name"); //写入name标签内文本 serializer.text("文本内容"); //写入name结束标签 serializer.endTag(null,"name"); //同样方法写student标签的子标签age //写入student结束标签 serializer.endTag(null,"student"); //同样方法写多个student,一般使用循环 //写入结束根标签 serializer.endTag(null,"students"); //文档结束 serializer.endDocument(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |