java中xml,反射的运用


XML: eXtensible Markup Language 可扩展的标记语言 xml只代表数据本身,而不包含任何样式结构的呈现,所以也称之为一种数据描述语言 Html&XML: HTML 和XML都属于SGML(标准通用标记)语言分支 程序型标记-HTML (HTML5 不属于SGML分支) 【XHTML无人更新,在2.0版本就被HTML5代替了】 描述型标记-XML-(1998年正式形成标准) 两者都由W3C来维护 XML作用: 1,实现不同平台之间的数据交换(webservice:soap 协议) 2,XML还可以用于一些应用软件的配置文件(Java 框架/tomcat/Servlet) XML文档构成: 一个标准的XML文档由3个部分构成 1,xml指令 2,文档类型定义 非标准的XML文档可以不用加 3,文档元素部分 xml指令主要描述xml版本(目前为1.0),编码,文档类型定义(standalone)定义是否是一个独立的文件 文档类型定义(DTD,XSD):规范文档中允许的标记,属性,已经标记之间的关系 文档的详细构成:标签,文本,属性 xml元素:由一对标签以及标签间的内容构成 xml标签:主要包含开始标记和结束标记 xml属性:属性通常定义在元素的开始标签中 SOMETHING CDATA:元数据 XML规范: xml规范相对于html来说相对严格 1,xml标记必须成对出现(空标签除外) 2,标签严格区分大小写 3,属性值必须用“”来进行引用 4,属性值中不能包含特殊符号<>,&,. 5,xml 支持类似html中实体*(<>") 6,注释代码不允许嵌套 7,XML文档有且仅有一个根节点 文档规范:生成一个DTD文档 /*****************************************************************/ --> ]> //代表该XML里面的标签要遵循的规定 XML 2017年11月17日 1:34 分区 Java课程 的第 1 页 ]> //代表该XML里面的标签要遵循的规定 二蛋 18 未婚 /****************************************************************/ 命名空间:namesqace,防止标签的命名冲突 Apples Bananas African Coffee Table 80 120 JSON&XML: AJAX:异步的JavaScript&XML JSON:是一种轻量级的数据交换格式,实现不同平台之间的数据交换 XML解析: 优点:适合解析较小的文档,解析速度快,可以任意搜索节点,并行搜索; 缺点:一次性加载的整个文档,会消耗大量的内存,无法解析过大的文件; Node 、 Document 、 DocumentBuilder 1,DOM解析(W3C标准,由JAVA运行):将需要被解析的文档完整的加载到内存中,解析为一颗倒置的文档树,可以通过解析器获取文档树中的节点; public class ParseByDOM { //实例化一个解析工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //获取解析器对象 DocumentBuilder builder = factory.newDocumentBuilder(); //解析文件并获取文档对象 Document document = builder.parse(new File(“src/userInfo.xml“)); //根据元素的标签名获取元素并取出匹配第一个元素(获取文档根节点) Node root = document.getElementsByTagName(“users“).item(0); //获取当前节点下的所有子节点 NodeList list = root.getChildNodes(); Node node = list.item(i); //判断当前节点名称是否为user //获取节点中的属性节点集合 NamedNodeMap nnm = node.getAttributes(); //根据节点名称(属性名)获取节点值(属性值) String id = nnm.getNamedItem(“id“).getNodeValue(); String type = nnm.getNamedItem(“type“).getNodeValue(); System.out.println(id); System.out.println(type); //继续搜索user节点下的子节点 NodeList user_child_list = node.getChildNodes(); Node c = user_child_list.item(j); String name = c.getTextContent(); System.out.println(“姓名:“+name); if(“name“.equals(c.getNodeName())){ if(c != null){ for(int j=0;i books; private Book book; private String nowTag;//记录当前读取的标记 //文档开始时触发 @Override System.out.println(“开始解析“); books = new ArrayList(); public void startDocument() throws SAXException { } //读取到开始标记时触发 /** * @param uri 命名空间的uri地址 * @param localName 不带命名空间前缀的标签名称 * @param qName 包含命名空间的标签名 * @param attributes 元素中的属性列表 */ @Override System.out.println(“读取到开始标记:“+qName); //记录当前读取到的开始标记 nowTag = qName; //当读取到一个开始的book标记后创建一个book对象 if(“book“.equals(qName)){ public void startElement(String uri, String localName, String qName, Attributes attr) throws SAXException { /************************************************代码如下***********************************************************************/ 分区 Java课程 的第 3 页 book = new Book(); book.setNo(attr.getValue(“no“)); if(“book“.equals(qName)){ } } //读取到文本节点时触发 @Override System.out.println(“读取到文本节点:“+new String(c,start,length)); String value = new String(c,start,length); //根据当前记录的标记决定将文本值设置给对象的哪一个属性 book.setName(value); if(“name“.equals(nowTag)){ book.setAuthor(value); }else if(“author“.equals(nowTag)){ book.setPrice(value); }else if(“price“.equals(nowTag)){ book.setPublish(value); }else if(“publish“.equals(nowTag)){ } //将节点置为空(重要) nowTag = ““; public void characters(char[] c, int start, int length) throws SAXException { } //读取到结束标记时触发 @Override System.out.println(“读取到结束标记:“+qName); //判断是否读取到book结束 books.add(book); if(“book“.equals(qName)){ } public void endElement(String uri, String localName, String qName) throws SAXException { } //文档结束时触发 @Override System.out.println(“解析完成“); public void endDocument() throws SAXException { } //创建解析器工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //生产解析器 SAXParser parse = factory.newSAXParser(); ParseBySAX pbs = new ParseBySAX(); //开始解析 parse.parse(“src/book.xml“,pbs); List list = pbs.books; System.out.println(list); public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { } } /**************************************************************************************************************************** ***/ Java特定的文档对象模型。自身不包含解析器,使用SAX 3,JDOM(java-based Document Object Model)解析: 优点:使用具体类而不是接口,简化了DOM的API;大量使用了Java集合类,方便了开发人员 缺点:没有较好的灵活性;性能差 public class ParseByJDOM { //创建解析器 SAXBuilder builder = new SAXBuilder(); //解析指定文档为一个Document对象 Document document = builder.build(new File(“src/book.xml“)); //获取文档的根节点 Element root = document.getRootElement(); //获取根节点下所有的 List list = root.getChildren(“book“); //遍历所有的book节点 public static void main(String[] args) throws JDOMException, IOException { /************************************************代码如下***********************************************************************/ 分区 Java课程 的第 4 页 //遍历所有的book节点 //取出节点中指定属性值 String no = e.getAttributeValue(“no“); //获取当前节点下指定名称的单个子节点,并去到节点中的文本值 String name = e.getChild(“name“).getText(); String author = e.getChild(“author“).getText(); String publish = e.getChild(“publish“).getText(); String price = e.getChild(“price“).getText(); System.out.println(no); System.out.println(author); System.out.println(name); System.out.println(publish); System.out.println(price); System.out.println(“============“); for (Element e : list) { } } } /**************************************************************************************************************************** ***/ 4,DOM4J(Document Object Model for JAVA)解析:简单易用,采用JAVA集合框架,并完全支持DOM、SAX、JAXP 优点:大量使用了JAVA集合类,方便JAVA开发人员,同时提供一些提高性能的替代方法;支持XPath;有很好的性能 缺点:大量使用接口API较为复杂 /************************************************代码如下***********************************************************************/ /** * dom4j:document object model for java * * log4j * slf4j * pinyin4j * * @author mrchai * */ public class ParseByDOM4J { //创建一个dom4j解析器 SAXReader reader = new SAXReader(); //解析文档 Document document = reader.read(new File(“src/book.xml“)); //获取根节点 Element root = document.getRootElement(); //获取当前根节点下指定名称的子节点集合 List list = root.elements(“book“); //获取当前元素的no属性值 String no = e.attributeValue(“no“); String name = e.element(“name“).getText(); String author = e.element(“author“).getText(); String price = e.element(“price“).getText(); String publish = e.element(“publish“).getText(); System.out.println(no); System.out.println(name); System.out.println(author); System.out.println(price); System.out.println(publish); for (Element e : list) { } public static void main(String[] args) throws DocumentException { } } /**************************************************************************************************************************** ***/ -DOM4J_Xpath 快速获取文本中的某一节点 /**************************************************************************************************************************** ***/ public class ParseByDOM4J_XPath { //获取解析器 SAXReader reader = new SAXReader(); //解析文件获取文档对象 Document document = reader.read(new File(“src/book.xml“)); public static void main(String[] args) throws DocumentException { 分区 Java课程 的第 5 页 Document document = reader.read(new File(“src/book.xml“)); //快速搜索books/book/name节点 List list = document.selectNodes(“books/book/name“); String qname = node.getName(); String name = node.getText(); System.out.println(qname+“===“+name); for (Node node : list) { } List list2 = document.selectNodes(“books/book“); //获取节点的指定属性值 String no = node.valueOf(“@no“); System.out.println(“--->“+no); for (Node node : list2) { } } } /**************************************************************************************************************************** ***/ 完整应用示例代码如下: /**************************************************************************************************************************** ***/ public class ParseBook2 { public static List parse(File file) throws DocumentException List books = new ArrayList(); Book book = null; SAXReader reader = new SAXReader(); Document document = reader.read(file); List list = document.selectNodes(“books/book“); String no = node.valueOf(“@no“); String name = node.selectSingleNode(“name“).getText(); String author = node.selectSingleNode(“author“).getText(); String price = node.selectSingleNode(“price“).getText(); String publish = node.selectSingleNode(“publish“).getText(); book = new Book(no, name, author, price, publish); books.add(book); for (Node node : list) { } return books; { } List list = ParseBook2.parse(new File(“src/book.xml“)); System.out.println(list); public static void main(String[] args) throws DocumentException { } } /**************************************************************************************************************************** ***/ 使用DOM4J创建XML文件: 使用DOM4J中的API来创建一个XML文件 /**********************************************************代码如下*************************************************/ public class CreateXML { //创建一个文档对象 Document document = DocumentHelper.createDocument(); //创建根节点 Element root = document.addElement(“books“); Element book = root.addElement(“book“).addAttribute(“no“, “0911239“); book.addElement(“name“).setText(“疯狂java讲义“); book.addElement(“author“).setText(“李刚“); book.addElement(“price“).setText(“99.7“); book.addElement(“publish“).setText(“电子工业出版社“); //创建一个文档的输出格式对象 //OutputFormat fmt = new OutputFormat ();//不在意格式就写这个 OutputFormat fmt = OutputFormat.createPrettyPrint(); fmt.setEncoding(“gbk“); public static void main(String[] args) throws IOException { File file = new File(“src/bk.xml“); FileWriter fw = new FileWriter(file); //XML文件输出流 XMLWriter writer = new XMLWriter(fw, fmt);//装饰器模式 writer.write(document); writer.flush(); 分区 Java课程 的第 6 页 writer.flush(); writer.close(); } } /*********************************************************创建的XML文件内容************************************************************/ 疯狂java讲义 李刚 99.7 电子工业出版社 /**************************************************************************************************************************** ***/ 分区 Java课程 的第 7 页
还剩6页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

935681306

贡献于2017-12-06

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf