`
qianhao_1987
  • 浏览: 20413 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

XML文件解析大杂烩

阅读更多
XML文件解析总结

一、DOM(document object model)解析
1. 简述
由W3C提供的接口,将整个XML文档一次性加载到内存中,构造一个DOM树来对各个节点进行操作。提供了DomcumentBuilderFactory/DomcumentBuilder接口来完成对XML文档的解析
2. 实例代码
public void createXml() throws Exception {
		// 创建解析工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 创建解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 创建Document对象
		Document document = builder.newDocument();
		// 创建根结点
		Element root = document.createElement("china");
		// 创建子节点
		Element c1 = document.createElement("beijin");
		Element c2 = document.createElement("shanghai");
		Element c3 = document.createElement("guangdong");
		Element c3_1 = document.createElement("guangzhou");
		Element c3_2 = document.createElement("shenzhen");
		Element c3_3 = document.createElement("dongguang");
		// 设置节点值
		Text t3_1 = document.createTextNode("广州");
		Text t3_2 = document.createTextNode("深圳");
		Text t3_3 = document.createTextNode("东莞");

		// 设置文档层次结构
		root.appendChild(c1);
		root.appendChild(c2);
		c3_1.appendChild(t3_1);
		c3_2.appendChild(t3_2);
		c3_3.appendChild(t3_3);

		c3.appendChild(c3_1);
		c3.appendChild(c3_2);
		c3.appendChild(c3_3);

		root.appendChild(c3);
		document.appendChild(root);
		document2xml(document);
		System.out.println("基于DOM方式的XML文件创建完成。。。。");
	}

	@Override
	public void parserXml() throws Exception {
		// 创建解析工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 创建解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse(FILE_NAME);
		NodeList nodeList4Root = document.getChildNodes();
		// 此方法只为介绍DOM解析XML文件的简单例子,只限于3层
		// 遍历所有XML文件中的第一层结构
		for (int i = 0; i < nodeList4Root.getLength(); i++) {
			Node node = nodeList4Root.item(i);
			NodeList nodeList4Child = node.getChildNodes();
			// 遍历所有XML文件中的第二层结构
			for (int j = 0; j < nodeList4Child.getLength(); j++) {
				Node node4CC = nodeList4Child.item(j);
				NodeList nodeList4CC = node4CC.getChildNodes();
				if (nodeList4CC.getLength() > 1) {
					// 遍历所有XML文件中的第三层结构
					for (int k = 0; k < nodeList4CC.getLength(); k++) {
						Node n = nodeList4CC.item(k);
						System.out.println("nodeName:" + n.getNodeName()
								+ " nodeValue:" + n.getTextContent());
					}
				} else {
					System.out.println("nodeName:" + node4CC.getNodeName()
							+ " nodeValue:" + node4CC.getTextContent());
				}
			}
			System.out.println("解析完成!!!");
		}
	}

	private void document2xml(Document document) throws Exception {
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer transformer = factory.newTransformer();
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		DOMSource source = new DOMSource(document);
		StreamResult sr = new StreamResult(new File(FILE_NAME));
		transformer.transform(source, sr);
	}


二、SAX解析
1. 简述
   SAX解析是基于事件驱动方式来对整个XML文件进行解析操作,它在解析XML文件的时候会触发一系列事件,当发现给定的标签时,将调用一个回调函数,告知该方法制定的标签已经找到。提供SAXParserFactory/SAXParser接口完成文档的解析。
2. 实例代码
public void createXml() throws Exception {

		// 设置输出地址
		Result result = new StreamResult(new FileOutputStream(FILE_NAME));

		// 创建SAX转换器
		SAXTransformerFactory sff = (SAXTransformerFactory) SAXTransformerFactory
				.newInstance();

		// 创建SAX转化处理对象
		TransformerHandler handler = sff.newTransformerHandler();
		Transformer transformer = handler.getTransformer();

		// 设置文档输出格式
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

		// 将处理结果输出到文件中
		handler.setResult(result);

		// 开始创建
		handler.startDocument();

		// 设置文档标签与标签之间的距离,子级与父级为4个字节长度,子级与祖父级为8个字节长度
		String four = "\n    ";
		String eight = "\n        ";

		// 设置标签属性
		AttributesImpl attr = new AttributesImpl();

		// 处理开始标签,根节点
		handler.startElement("", "", "china", attr);
		handler.characters(four.toCharArray(), 0, four.length());

		// 处理各个子标签
		handler.startElement("", "", "beijin", attr);
		// handler.characters(eight.toCharArray(), 0, eight.length());
		handler.endElement("", "", "beijin");

		handler.characters(four.toCharArray(), 0, four.length());
		handler.startElement("", "", "shanghai", attr);
		// handler.characters(four.toCharArray(), 0, four.length());
		handler.endElement("", "", "shanghai");

		handler.characters(four.toCharArray(), 0, four.length());
		handler.startElement("", "", "guangdong", attr);
		handler.characters(eight.toCharArray(), 0, eight.length());

		handler.startElement("", "", "guangzhou", attr);
		String gz = "广州";
		handler.characters(gz.toCharArray(), 0, gz.length());
		handler.endElement("", "", "guangzhou");

		handler.characters(eight.toCharArray(), 0, eight.length());
		handler.startElement("", "", "shenzhen", attr);
		String sz = "深圳";
		handler.characters(sz.toCharArray(), 0, sz.length());
		handler.endElement("", "", "shenzhen");
		handler.characters(eight.toCharArray(), 0, eight.length());

		handler.startElement("", "", "dongguang", attr);
		String dg = "东莞";
		handler.characters(dg.toCharArray(), 0, dg.length());
		handler.endElement("", "", "dongguang");

		handler.characters(four.toCharArray(), 0, four.length());

		handler.endElement("", "", "guangdong");

		handler.endElement("", "", "china");
		// 处理结束
		handler.endDocument();

		System.out.println("SAX创建文件完成!!!");

	}

	@Override
	public void parserXml() throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		javax.xml.parsers.SAXParser parser = factory.newSAXParser();
		InputStream is = new FileInputStream(new File(FILE_NAME));
		parser.parse(is, new SAXParserInner());
	}

	class SAXParserInner extends DefaultHandler {

		private Stack tags = new Stack();

		@Override
		public void endDocument() throws SAXException {
			System.out.println("文档解析结束!!!");
		}

		@Override
		public void endElement(String uri, String localName, String name)
				throws SAXException {
			System.out.println("endElment name: " + name);
		}

		@Override
		public void startDocument() throws SAXException {
			System.out.println("文档解析开始!!!");
		}

		@Override
		public void startElement(String uri, String localName, String name,
				Attributes attributes) throws SAXException {
			tags.push(name);
			System.out.println("startElement name: " + name);
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			String tagName = (String) tags.peek();
			if (tagName.equalsIgnoreCase("guangzhou")
					|| tagName.equalsIgnoreCase("shenzhen")
					|| tagName.equalsIgnoreCase("dongguang")) {
				System.out.println("value = " + new String(ch, start, length));
                
			}
		}

	}


三、JDOM解析
1. 简述
JDOM与DOM非常类似。它是处理XML的纯JAVA API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口。JDOM 它自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档,尽管它还可以将以前构造的 DOM 表示作为输入。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。
2.实例代码
public void createXml() throws Exception {
		// 创建根节点
		Element root = new Element("china");
		// 将根结点添加到文档
		Document doc = new Document(root);
		// 设置子节点
		Element bj = new Element("beijin");
		Element sh = new Element("shanghai");
		Element gd = new Element("guangdong");
		gd.addContent(new Element("guangzhou").setText("广州"));
		gd.addContent(new Element("shenzhen").setText("深圳"));
		gd.addContent(new Element("dongguan").setText("东莞"));
		root.addContent(bj);
		root.addContent(sh);
		root.addContent(gd);
        
		Format fmt = Format.getPrettyFormat();
		fmt.setIndent(" ");
		// 将内容输出到文件中
		XMLOutputter op = new XMLOutputter();
		op.setFormat(fmt);
		op.output(doc, new FileOutputStream(new File(FILE_NAME)));
		System.out.println("JDOM创建文件结束!!!");
	}

	@Override
	public void parserXml() throws Exception {
		SAXBuilder sb = new SAXBuilder();// 建立构造器
		Document doc = sb.build(new FileInputStream(FILE_NAME));// 读入指定文件
		Element root = doc.getRootElement();// 获得根节点
		List<?> list = root.getChildren();// 将根节点下的所有子节点放入List中
		for (int i = 0; i < list.size(); i++) {
			Element child = (Element) list.get(i);// 取得节点实例
			if (child.getContent() != null) {
				List<Element> child_2 = child.getChildren();
				for (Element ch : child_2) {
					System.out.println("name= " + ch.getName() + " value= "
							+ ch.getText());
				}
			}
		}
		System.out.println("JDOM解析文件完成!!!");
	}


四、DOM4j解析
1. 简述
dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解XML),它合并了许多超出基本 XML 文档表示的功能。包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。
2.实例代码
public void createXml() throws Exception {
		// 创建文档实例
		Document doc = DocumentHelper.createDocument();
		Element root = doc.addElement("china");
		// 增加注释
		root.addComment("根节点");
		// 增加子节点
		root.addElement("beijing");
		root.addElement("shanghai");
		Element gd = root.addElement("guangdong");
		Element gz = gd.addElement("guangzhou");
		gz.addText("广州");
		Element sz = gd.addElement("shenzhen");
		sz.addText("深圳");
		Element dg = gd.addElement("dongguang");
		dg.addText("东莞");
		// 格式化输出的XML
		OutputFormat output = OutputFormat.createPrettyPrint();
		output.setEncoding(Charset.forName("gbk").displayName());
		// 把XML从内存中写入文件
		XMLWriter writer = new XMLWriter(new FileWriter(FILE_NAME), output);
		writer.write(doc);
		writer.close();// 不能缺少,说明文档已创建完成,否则文件内容为空
		System.out.println("DOM4j创建文件完成!!!");
	}

	@Override
	public void parserXml() throws Exception {
		/** 使用SAXReader解析文件 **/
		SAXReader saxReader = new SAXReader();
		Document doc = saxReader.read(FILE_NAME);
		Element root = doc.getRootElement();
		// 遍历所有子节点
		for (Iterator it = root.elementIterator(); it.hasNext();) {
			Element element = (Element) it.next();
			if (element.getText() != null && !"".equals(element.getText()))
				for (Iterator it1 = element.elementIterator(); it1.hasNext();) {
					Element element1 = (Element) it1.next();
					System.out.println("name= " + element1.getName()
							+ " value= " + element1.getText());

				}
		}
		System.out.println("DOM4J parser completed by SAXReader!!!");
		/**DOMReader解析文件**/
		DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		org.w3c.dom.Document document = builder.parse(FILE_NAME);
		DOMReader domReader = new DOMReader();
		Document document_4j = domReader.read(document);
		Element r = document_4j.getRootElement();
		// 遍历所有子节点
		for (Iterator it = r.elementIterator(); it.hasNext();) {
			Element element = (Element) it.next();
			if (element.getText() != null && !"".equals(element.getText()))
				for (Iterator it1 = element.elementIterator(); it1.hasNext();) {
					Element element1 = (Element) it1.next();
					System.out.println("name= " + element1.getName()
							+ " value= " + element1.getText());

				}
		}
		System.out.println("DOM4J parser completed by DOMReader!!!");
        /**XPath解析文件**/
		SAXReader saxReader_xpath = new SAXReader();
		Document doc_xpath = saxReader_xpath.read(FILE_NAME);
		List list = doc_xpath.selectNodes("/china/guangdong/shenzhen");
		for(Iterator it = list.iterator();it.hasNext();){
			Element element = (Element) it.next();
			System.out.println("name= " + element.getName()
					+ " value= " + element.getText());
		}
		System.out.println("DOM4J parser completed by XPathParser!!!");
	}


五、XStream解析
1.简介
使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口
2.实例代码
public void createXml() throws Exception {
		//创建转换类
		//XStream xs = new XStream();
		XStream xs = new XStream(new DomDriver("utf-8")); 
		//根节点
		China china = new China();
		xs.alias("china", China.class);
		china.setId("china");
		//将成员变量设置为属性值
		xs.useAttributeFor(China.class, "id");
		//子节点
		Beijin bj = new Beijin();
		china.setBeijin(bj);
		
		//子节点
		ShangHai sh = new ShangHai();
		
		//转换China对象中sh属性名为shanghai
		xs.aliasAttribute(China.class,"sh", "shanghai");
		china.setSh(sh);
		//子节点
		GuangDong gd = new GuangDong();
		xs.aliasAttribute(China.class,"gd", "guangdong");
		gd.setGz("广州");
		//装换属性别名
		xs.aliasField("guangzhou", GuangDong.class, "gz");
		china.setGd(gd);
		
		gd.setShenzhen("深圳");
	    gd.setDg("东莞");
	    xs.aliasField("dongguang", GuangDong.class, "dg");
		String result = xs.toXML(china);
		System.out.println(result);
		//将装换后的结果写入文件中
		OutputStream fos = new FileOutputStream(FILE_NAME);
		//字符编码装换,默认为UTF-8
		Writer writer = new OutputStreamWriter(fos,Charset.forName("UTF-8"));
 		xs.toXML(china, writer);
 		fos.close();
 		System.out.println("Xstream创建文件成功!!!");
 		
	}

	@Override
	public void parserXml() throws Exception {
		//依懒xpp解析器 
		//XStream xs = new XStream();
		//运用标准的DOM解析器 
		XStream xs = new XStream(new DomDriver("utf-8")); 
		InputStream fos = new FileInputStream(new File(FILE_NAME));
		xs.alias("china", China.class);
		xs.aliasAttribute(China.class,"id","id");
		xs.aliasAttribute(China.class,"sh","shanghai");
		xs.aliasAttribute(China.class,"gd","guangdong");
		xs.aliasAttribute(GuangDong.class,"gz","guangzhou");
		xs.aliasAttribute(GuangDong.class,"dg","dongguang");
		China china =(China)xs.fromXML(fos);
		System.out.println("属性值:" + china.getId());
		System.out.println("shenzhen :" + china.getGd().getShenzhen());
	}
分享到:
评论

相关推荐

    亮剑.NET:.NET深入体验与实战精要清晰版及源码

     第3章 asp.net开发大杂烩  3.1 页面生命周期  3.2 页面状态管理  ……  第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——...

    亮剑.NET深入体验与实战精要.part1.

     第3章 asp.net开发大杂烩  3.1 页面生命周期  3.2 页面状态管理  ……  第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——...

    亮剑.NET深入体验与实战精要.part3

     第3章 asp.net开发大杂烩  3.1 页面生命周期  3.2 页面状态管理  ……  第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——...

    亮剑.NET深入体验与实战精要.part4(完)

     第3章 asp.net开发大杂烩  3.1 页面生命周期  3.2 页面状态管理  ……  第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——...

    亮剑.NET深入体验与实战精要.part2

     第3章 asp.net开发大杂烩  3.1 页面生命周期  3.2 页面状态管理  ……  第4章 windows窗体编程你也行  第5章 数据库开发  第6章 关于xml  第7章 web service开发详解  第8章 用户体验的杀手锏——...

    亮剑.NET深入体验与实战精要2

    第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 3.1.1 独立页面生命周期事件顺序 114 3.1.2 具有Master页的生命周期事件顺序 116 3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2...

    亮剑.NET深入体验与实战精要3

    第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 3.1.1 独立页面生命周期事件顺序 114 3.1.2 具有Master页的生命周期事件顺序 116 3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    22.6.3 Microsoft ASP.NET Web窗体和XML Web服务应用程序 22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用...

    CLR.via.C#.(中文第3版)(自制详细书签)

    22.6.3 Microsoft ASP.NET Web窗体和XML Web服务应用程序 22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    22.6.3 Microsoft ASP.NET Web窗体和XML Web服务应用程序 22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    22.6.3 Microsoft ASP.NET Web窗体和XML Web服务应用程序 22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用...

Global site tag (gtag.js) - Google Analytics