`
jilong-liang
  • 浏览: 481521 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

使用XMLInputFactory,XMLStreamReader,XMLEventReader解析XML文件

    博客分类:
  • XML
阅读更多
package com.org.domain;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
 * 使用XMLInputFactory,XMLStreamReader,XMLEventReader解析XML文件
 *
 */
public class DoXML {
	private String url="com/org/config/MyXml.xml";
	/**
	 * 文件读取流获取XML节点
	 * @throws IOException
	 */
	@Test
	public void testXMLStreamReader() throws IOException {
		try {
			XMLInputFactory factory = XMLInputFactory.newInstance();
			InputStream in = DoXML.class.getClassLoader().getResourceAsStream(url);
			XMLStreamReader reader = factory.createXMLStreamReader(in);
			while (reader.hasNext()) {
				int type = reader.next();
				if(type==XMLStreamConstants.START_ELEMENT){//开始节点
					System.out.print(reader.getName());
				}else if(type==XMLStreamConstants.CHARACTERS){//表示事件字符
					System.out.println("type"+type);
				}else if(type==XMLStreamConstants.END_ELEMENT){//结束节点
					System.out.println(reader.getName());
				}
			}
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * XML事件读取
	 */
	@Test
	public void testXMLEventReader(){
		try {
			XMLInputFactory factory = XMLInputFactory.newInstance();
			InputStream in = DoXML.class.getClassLoader().getResourceAsStream(url);
			XMLEventReader reader = factory.createXMLEventReader(in);
			while(reader.hasNext()){
				XMLEvent event = reader.nextEvent();
				if(event.isStartElement()){
					String name = event.asStartElement().getName().toString();
					if("Title".equals(name)){
						System.out.println(reader.getElementText());
					}
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 通过XML事件Filter过滤节点的值
	 */
	@Test
	public void testXMLFilteredReader(){
		try {
			XMLInputFactory factory = XMLInputFactory.newInstance();
			InputStream in = DoXML.class.getClassLoader().getResourceAsStream(url);
			XMLEventReader eventReader = factory.createXMLEventReader(in);
			XMLEventReader reader = factory.createFilteredReader(eventReader, new EventFilter() {
				@Override
				public boolean accept(XMLEvent event) {
					//有Titl节点返回true,否则返回false
					if(event.isStartElement()) {
						String name = event.asStartElement().getName().toString();
						if(name.equals("Title")){
							return true;
						}
					}
					return false;
				}
			});
			while(reader.hasNext()){
				XMLEvent event = reader.nextEvent();
				if(event.isStartElement()){
					String name = event.asStartElement().getName().toString();
					if("Title".equals(name)){
						System.out.println(reader.getElementText());
					} 
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 通过XPath拿节点的值
	 */
	@Test
	public void testXPathXMLNodeText(){
		try {
			InputStream in = DoXML.class.getClassLoader().getResourceAsStream(url);
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder  db = factory.newDocumentBuilder();
			Document doc = db.parse(in);
			
			XPathFactory xPathFactory = XPathFactory.newInstance();
			XPath xpath = xPathFactory.newXPath();
			String expression = "Articles//item[@category='language']";
			
			NodeList nodeList = (NodeList)xpath.evaluate(expression,doc,XPathConstants.NODESET);
			for(int i = 0 ; i< nodeList.getLength();i++){
				Element	 ele = (Element)(nodeList.item(i));
				NodeList tiel =   ele.getElementsByTagName("Title");
				Element e  = (Element) tiel.item(0);
				System.out.println(e.getTextContent());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
	/**
	 * 修改XML节点的值
	 */
	@Test
	public void testUpdateXMLNodeText(){
		try {
			InputStream in = DoXML.class.getClassLoader().getResourceAsStream(url);
			Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
			XPath xPath = XPathFactory.newInstance().newXPath();
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
			String expression = "Articles//item[@category='language']/Title";//修改Title的值
			NodeList nodelist = (NodeList)xPath.evaluate(expression, doc,XPathConstants.NODESET);
			Element price = (Element)(nodelist.item(0));
			price.setTextContent("PHP");
			transformer.transform(new DOMSource(doc), new StreamResult(System.out));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 组装XML
	 */
	//@Test
	public void testXMLStreamWriter(){/*
		try {
			XMLOutputFactory factory = XMLOutputFactory.newInstance();
			XMLStreamWriter writer = factory.createXMLStreamWriter(System.out);
			String ns= "http://www.google.com";
			writer.writeStartDocument("UTF-8","1.0");
			writer.setDefaultNamespace("http://www.google.com");
			writer.writeDefaultNamespace("http://www.google.com");
			writer.writeNamespace("ns", ns);
			writer.setPrefix("ns", ns);
			writer.writeStartElement("ns","this",ns);
			writer.writeCharacters("test");
			writer.writeStartElement("ns","test",ns);
			writer.writeCharacters("content");
			writer.writeEndElement();
			writer.writeEndElement();
			writer.writeEndDocument();
			writer.flush();
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	*/}
}

 

<?xml version="1.0" encoding="UTF-8"?>
<Articles>
	<item category='language'>
		<Title>Java</Title>
		<Description>跨平台</Description>
	</item>
	<item>
		<Title>C#</Title>
		<Description>跨语言</Description>
	</item>
</Articles>

 

0
2
分享到:
评论

相关推荐

    java解析XML文件

    Java中的StAX解析主要使用`javax.xml.stream.XMLInputFactory`、`javax.xml.stream.XMLEventReader`和`javax.xml.stream.XMLStreamReader`: ```java import javax.xml.stream.XMLInputFactory; import javax.xml....

    Java解析XML

    首先,我们需要创建一个`DocumentBuilderFactory`实例,然后使用它创建`DocumentBuilder`,最后通过`parse()`方法解析XML文件并返回一个`Document`对象。 2. **SAX解析器**: Simple API for XML (SAX) 是一种基于...

    stax 解析xml demo project

    - 使用`XMLInputFactory`的`createXMLStreamReader()`方法,传入XML文件的输入源,创建`XMLStreamReader`。 - 循环调用`XMLStreamReader`的`next()`方法,处理每个XML事件。 - 在事件处理中,根据事件类型进行...

    XML解析工具类

    Java中的`javax.xml.stream.XMLInputFactory` 和 `javax.xml.stream.XMLOutputFactory` 用于创建输入和输出流,而`javax.xml.stream.XMLStreamReader` 和 `javax.xml.stream.XMLEventReader` 分别用于读取和处理事件...

    java使用stax技术操作XML文档.doc

    在后续的系列文章中,通常会进一步探讨基于事件迭代器的API,包括如何使用XMLEventReader处理各种XML事件,以及如何利用这些事件对象来构建更复杂的XML处理逻辑。同时,也会探讨如何在实际的业务应用程序中有效地...

    java解析xml 可以用

    Java解析XML是一个常见的任务,XML(可扩展标记语言)作为一种数据交换格式,广泛应用于网络服务、配置文件和数据存储等领域。在Java中,有多种库和技术可以用来解析XML文档,主要包括DOM、SAX和StAX。 1. DOM...

    java 解析xml

    - `javax.xml.stream.XMLInputFactory` 用于创建XMLStreamReader,这是读取XML的流式解析器。 - `javax.xml.stream.XMLEventReader` 提供了一种基于事件的读取XML的方法,可以按需读取下一个事件。 - `javax.xml....

    XML读取解析,(初学者)

    - 引入`javax.xml.stream`包下的`XMLInputFactory`,`XMLStreamReader`和`XMLEventReader`类。 - 创建`XMLInputFactory`,通过`createXMLStreamReader()`或`createXMLEventReader()`方法获取读取器,然后使用迭代...

    Demo4j解析XML文档实例和方法总结(经典)

    在Demo4j中,你可能能看到使用`javax.xml.stream.XMLInputFactory`, `XMLStreamReader`或`XMLEventReader`的示例。这种方式既不像DOM那样占用大量内存,也不需要像SAX那样处理大量的事件回调。 除了基础的解析方法...

    JAVA操作XML文件

    StAX使用`javax.xml.stream.XMLInputFactory`、`XMLStreamReader`和`XMLEventReader`等类。它提供了一个迭代器模型,允许开发者按需读取XML事件,既可以向前也可以向后移动,适合处理大文件且需要高效性能的情况。 ...

    java对xml操作的项目案例

    - 读取:首先创建`DocumentBuilderFactory`实例,然后用其创建`DocumentBuilder`,最后调用`parse()`方法解析XML文件。 - 写入:通过`TransformerFactory`和`Transformer`,将DOM树转换为XML输出。 2. 使用SAX...

    用java来实现xml的例子.rar_XML java_xml

    Java中的`javax.xml.stream.XMLInputFactory`、`javax.xml.stream.XMLEventReader`和`javax.xml.stream.XMLStreamReader`类是StAX的主要组件。 在这个例子中,可能包含了一个或多个使用这些API的Java程序,可能是...

    XML Ajax的应用

    Java的`javax.xml.stream.XMLInputFactory`、`javax.xml.stream.XMLEventReader`和`javax.xml.stream.XMLStreamReader`类支持StAX解析。 在Ajax登录验证的场景中,服务器端通常使用这些XML解析方法之一来处理从...

    Java6JDK1.6新特性总结大全附代码.docx

    - 使用`XMLStreamReader`或`XMLEventReader`进行解析,例如: ```java XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader reader = factory.createXMLEventReader(new FileInputStream...

    java操作xml

    使用JDOM,你可以通过`org.jdom2.Document`和`org.jdom2.Element`等类来构建和解析XML。 ```java import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; import org.jdom2....

Global site tag (gtag.js) - Google Analytics