xml stax tutorials
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>net.aimeizi</groupId>
|
||||
<artifactId>maven-framework-project</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
<artifactId>xml-tutorials</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>xml-stax-example</module>
|
||||
</modules>
|
||||
</project>
|
||||
@@ -0,0 +1,28 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>net.aimeizi</groupId>
|
||||
<artifactId>xml-tutorials</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
<artifactId>xml-stax-example</artifactId>
|
||||
|
||||
<properties>
|
||||
<stax.version>1.2.0</stax.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>stax</groupId>
|
||||
<artifactId>stax</artifactId>
|
||||
<version>${stax.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,55 @@
|
||||
package net.aimeizi.xml.stax.example;
|
||||
|
||||
public class Item {
|
||||
private String date;
|
||||
private String mode;
|
||||
private String unit;
|
||||
private String current;
|
||||
private String interactive;
|
||||
|
||||
public String getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public void setDate(String date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public String getMode() {
|
||||
return mode;
|
||||
}
|
||||
|
||||
public void setMode(String mode) {
|
||||
this.mode = mode;
|
||||
}
|
||||
|
||||
public String getUnit() {
|
||||
return unit;
|
||||
}
|
||||
|
||||
public void setUnit(String unit) {
|
||||
this.unit = unit;
|
||||
}
|
||||
|
||||
public String getCurrent() {
|
||||
return current;
|
||||
}
|
||||
|
||||
public void setCurrent(String current) {
|
||||
this.current = current;
|
||||
}
|
||||
|
||||
public String getInteractive() {
|
||||
return interactive;
|
||||
}
|
||||
|
||||
public void setInteractive(String interactive) {
|
||||
this.interactive = interactive;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Item [current=" + current + ", date=" + date + ", interactive="
|
||||
+ interactive + ", mode=" + mode + ", unit=" + unit + "]";
|
||||
}
|
||||
}
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
package net.aimeizi.xml.stax.example;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.stream.XMLEventReader;
|
||||
import javax.xml.stream.XMLInputFactory;
|
||||
import javax.xml.stream.events.Attribute;
|
||||
import javax.xml.stream.events.EndElement;
|
||||
import javax.xml.stream.events.StartElement;
|
||||
import javax.xml.stream.events.XMLEvent;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @see http://www.vogella.com/articles/JavaXML/article.html
|
||||
* @author scott
|
||||
*
|
||||
*/
|
||||
public class StaXParser {
|
||||
static final String DATE = "date";
|
||||
static final String ITEM = "item";
|
||||
static final String MODE = "mode";
|
||||
static final String UNIT = "unit";
|
||||
static final String CURRENT = "current";
|
||||
static final String INTERACTIVE = "interactive";
|
||||
|
||||
@SuppressWarnings({ "unchecked"})
|
||||
public List<Item> readConfig(InputStream in) {
|
||||
List<Item> items = new ArrayList<Item>();
|
||||
try {
|
||||
// First create a new XMLInputFactory
|
||||
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
|
||||
// Setup a new eventReader
|
||||
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
|
||||
// Read the XML document
|
||||
Item item = null;
|
||||
|
||||
while (eventReader.hasNext()) {
|
||||
XMLEvent event = eventReader.nextEvent();
|
||||
|
||||
if (event.isStartElement()) {
|
||||
StartElement startElement = event.asStartElement();
|
||||
// If we have a item element we create a new item
|
||||
if (startElement.getName().getLocalPart() == (ITEM)) {
|
||||
item = new Item();
|
||||
// We read the attributes from this tag and add the date
|
||||
// attribute to our object
|
||||
Iterator<Attribute> attributes = startElement
|
||||
.getAttributes();
|
||||
while (attributes.hasNext()) {
|
||||
Attribute attribute = attributes.next();
|
||||
if (attribute.getName().toString().equals(DATE)) {
|
||||
item.setDate(attribute.getValue());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (event.isStartElement()) {
|
||||
if (event.asStartElement().getName().getLocalPart()
|
||||
.equals(MODE)) {
|
||||
event = eventReader.nextEvent();
|
||||
item.setMode(event.asCharacters().getData());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (event.asStartElement().getName().getLocalPart()
|
||||
.equals(UNIT)) {
|
||||
event = eventReader.nextEvent();
|
||||
item.setUnit(event.asCharacters().getData());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (event.asStartElement().getName().getLocalPart()
|
||||
.equals(CURRENT)) {
|
||||
event = eventReader.nextEvent();
|
||||
item.setCurrent(event.asCharacters().getData());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (event.asStartElement().getName().getLocalPart()
|
||||
.equals(INTERACTIVE)) {
|
||||
event = eventReader.nextEvent();
|
||||
item.setInteractive(event.asCharacters().getData());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// If we reach the end of an item element we add it to the list
|
||||
if (event.isEndElement()) {
|
||||
EndElement endElement = event.asEndElement();
|
||||
if (endElement.getName().getLocalPart() == (ITEM)) {
|
||||
items.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}finally{
|
||||
if(in!=null){
|
||||
try {
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void test(){
|
||||
List<Item> readConfig = readConfig(ClassLoader.getSystemResourceAsStream("config.xml"));
|
||||
for (Item item : readConfig) {
|
||||
System.out.println(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
package net.aimeizi.xml.stax.example;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.xpath.XPath;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathExpression;
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
/**
|
||||
* @see http://www.vogella.com/articles/JavaXML/article.html
|
||||
* stax XPath query
|
||||
* @author scott
|
||||
*
|
||||
*/
|
||||
public class StaxQueryXML {
|
||||
|
||||
public void query() throws ParserConfigurationException, SAXException,IOException, XPathExpressionException {
|
||||
// Standard of reading a XML file
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
factory.setNamespaceAware(true);
|
||||
DocumentBuilder builder;
|
||||
Document doc = null;
|
||||
XPathExpression expr = null;
|
||||
builder = factory.newDocumentBuilder();
|
||||
doc = builder.parse(ClassLoader.getSystemResourceAsStream("person.xml"));
|
||||
|
||||
// Create a XPathFactory
|
||||
XPathFactory xFactory = XPathFactory.newInstance();
|
||||
|
||||
// Create a XPath object
|
||||
XPath xpath = xFactory.newXPath();
|
||||
|
||||
// Compile the XPath expression
|
||||
expr = xpath.compile("//person[firstname='Lars']/lastname/text()");
|
||||
// Run the query and get a nodeset
|
||||
Object result = expr.evaluate(doc, XPathConstants.NODESET);
|
||||
|
||||
// Cast the result to a DOM NodeList
|
||||
NodeList nodes = (NodeList) result;
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
System.out.println(nodes.item(i).getNodeValue());
|
||||
}
|
||||
|
||||
// New XPath expression to get the number of people with name lars
|
||||
expr = xpath.compile("count(//person[firstname='Lars'])");
|
||||
// Run the query and get the number of nodes
|
||||
Double number = (Double) expr.evaluate(doc, XPathConstants.NUMBER);
|
||||
System.out.println("Number of objects " + number);
|
||||
|
||||
// Do we have more then 2 people with name lars?
|
||||
expr = xpath.compile("count(//person[firstname='Lars']) >2");
|
||||
// Run the query and get the number of nodes
|
||||
Boolean check = (Boolean) expr.evaluate(doc, XPathConstants.BOOLEAN);
|
||||
System.out.println(check);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test() throws XPathExpressionException,ParserConfigurationException, SAXException, IOException {
|
||||
query();
|
||||
}
|
||||
}
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
package net.aimeizi.xml.stax.example;
|
||||
|
||||
import java.io.FileOutputStream;
|
||||
|
||||
import javax.xml.stream.XMLEventFactory;
|
||||
import javax.xml.stream.XMLEventWriter;
|
||||
import javax.xml.stream.XMLOutputFactory;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import javax.xml.stream.events.Characters;
|
||||
import javax.xml.stream.events.EndElement;
|
||||
import javax.xml.stream.events.StartDocument;
|
||||
import javax.xml.stream.events.StartElement;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class StaxWriter {
|
||||
|
||||
private String configFile;
|
||||
|
||||
public void setFile(String configFile) {
|
||||
this.configFile = configFile;
|
||||
}
|
||||
|
||||
public void saveConfig() throws Exception {
|
||||
// Create a XMLOutputFactory
|
||||
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
|
||||
// Create XMLEventWriter
|
||||
XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(new FileOutputStream(configFile));
|
||||
// Create a EventFactory
|
||||
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
|
||||
|
||||
//XMLEvent end = eventFactory.createDTD("\n");
|
||||
|
||||
// Create and write Start Tag
|
||||
StartDocument startDocument = eventFactory.createStartDocument();
|
||||
eventWriter.add(startDocument);
|
||||
|
||||
// Create config open tag
|
||||
StartElement configStartElement = eventFactory.createStartElement("","", "config");
|
||||
eventWriter.add(configStartElement);
|
||||
|
||||
//eventWriter.add(end);
|
||||
|
||||
// Write the different nodes
|
||||
createNode(eventWriter, "mode", "1");
|
||||
createNode(eventWriter, "unit", "901");
|
||||
createNode(eventWriter, "current", "100");
|
||||
createNode(eventWriter, "interactive", "5");
|
||||
|
||||
eventWriter.add(eventFactory.createEndElement("", "", "config"));
|
||||
|
||||
//eventWriter.add(end);
|
||||
|
||||
eventWriter.add(eventFactory.createEndDocument());
|
||||
eventWriter.close();
|
||||
}
|
||||
|
||||
private void createNode(XMLEventWriter eventWriter, String name,
|
||||
String value) throws XMLStreamException {
|
||||
|
||||
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
|
||||
|
||||
//XMLEvent end = eventFactory.createDTD("\n");
|
||||
//XMLEvent tab = eventFactory.createDTD("\t");
|
||||
|
||||
// Create Start node
|
||||
StartElement sElement = eventFactory.createStartElement("", "", name);
|
||||
//eventWriter.add(tab);
|
||||
eventWriter.add(sElement);
|
||||
// Create Content
|
||||
Characters characters = eventFactory.createCharacters(value);
|
||||
eventWriter.add(characters);
|
||||
// Create End node
|
||||
EndElement eElement = eventFactory.createEndElement("", "", name);
|
||||
eventWriter.add(eElement);
|
||||
//eventWriter.add(end);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
StaxWriter configFile = new StaxWriter();
|
||||
configFile.setFile("configx.xml");
|
||||
try {
|
||||
configFile.saveConfig();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+226
@@ -0,0 +1,226 @@
|
||||
package net.aimeizi.xml.stax.example;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.stream.EventFilter;
|
||||
import javax.xml.stream.FactoryConfigurationError;
|
||||
import javax.xml.stream.XMLEventReader;
|
||||
import javax.xml.stream.XMLInputFactory;
|
||||
import javax.xml.stream.XMLOutputFactory;
|
||||
import javax.xml.stream.XMLStreamConstants;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import javax.xml.stream.XMLStreamReader;
|
||||
import javax.xml.stream.XMLStreamWriter;
|
||||
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.TransformerFactoryConfigurationError;
|
||||
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.junit.Test;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
/**
|
||||
* 使用Stax解析xml
|
||||
* @author scott
|
||||
*
|
||||
*/
|
||||
public class StaxXmlUtil {
|
||||
|
||||
|
||||
/**
|
||||
* 基于光标的方式解析XML
|
||||
*/
|
||||
@Test
|
||||
public void cursorParseXML() throws Exception {
|
||||
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||
InputStream is = ClassLoader.getSystemResourceAsStream("books.xml");
|
||||
XMLStreamReader reader = factory.createXMLStreamReader(is);
|
||||
while(reader.hasNext()) {
|
||||
int type = reader.next();
|
||||
//处理不同的节点类型
|
||||
//处理开始节点,如<bookstore>,<book>
|
||||
if(type == XMLStreamConstants.START_ELEMENT) {
|
||||
String name = reader.getName().toString();
|
||||
System.out.println("<" + name + ">");
|
||||
//打印<book category="COOKING">节点中的第一个属性category值"COOKING"
|
||||
if(name.equals("book")){
|
||||
System.out.println("节点属性值为" + reader.getAttributeName(0) + "=" + reader.getAttributeValue(0));
|
||||
}
|
||||
if(name.equals("title")) {
|
||||
System.out.println("书籍[" + reader.getElementText() + "]");
|
||||
}
|
||||
if(name.equals("price")) {
|
||||
System.out.println("的价格为[" + reader.getElementText() + "]");
|
||||
}
|
||||
//打印文本节点的内容,注意各xml标签中的空白部分也属于文本节点..并且文本节点是没有name的,所以不能getName
|
||||
} else if(type == XMLStreamConstants.CHARACTERS) {
|
||||
System.out.println("文本节点值=[" + reader.getText().trim() + "]");
|
||||
//处理结束节点,如</book>,</title>
|
||||
} else if(type == XMLStreamConstants.END_ELEMENT) {
|
||||
System.out.println("</" + reader.getName() + ">");
|
||||
}
|
||||
}
|
||||
//最后处理完了xml,记得关闭..但不能提前关闭,因为Stax是读一点流就解析一点的
|
||||
is.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 基于迭代模型的方式解析XML
|
||||
*/
|
||||
@Test
|
||||
public void iteratorParseXML() throws Exception {
|
||||
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||
InputStream is = ClassLoader.getSystemResourceAsStream("books.xml");
|
||||
XMLEventReader reader = factory.createXMLEventReader(is);
|
||||
int iteratorNum = 0; //统计遍历的次数
|
||||
while(reader.hasNext()) {
|
||||
XMLEvent event = reader.nextEvent();
|
||||
if(event.isStartElement()) { //通过XMLEvent判断节点类型
|
||||
String name = event.asStartElement().getName().toString(); //通过event.asxxx转换节点
|
||||
if(name.equals("title")) {
|
||||
System.out.print("书籍[" + reader.getElementText() + "]");
|
||||
}
|
||||
if(name.equals("price")) {
|
||||
System.out.println("的价格为[" + reader.getElementText() + "]");
|
||||
}
|
||||
}
|
||||
iteratorNum++;
|
||||
}
|
||||
is.close();
|
||||
System.out.println("本次操作遍历XML的次数合计为[" + iteratorNum + "]次");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 基于Filter的方式解析XML
|
||||
* @see 可以有效的过滤掉不用进行操作的节点,效率会高一些
|
||||
*/
|
||||
@Test
|
||||
public void filterParseXML() throws Exception {
|
||||
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||
InputStream is = ClassLoader.getSystemResourceAsStream("books.xml");
|
||||
XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),
|
||||
new EventFilter() {
|
||||
@Override
|
||||
public boolean accept(XMLEvent event) {
|
||||
if(event.isStartElement()) {
|
||||
String name = event.asStartElement().getName().toString();
|
||||
if(name.equals("title") || name.equals("price")){
|
||||
return true; //返回true表示会显示,false表示不显示
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
int iteratorNum = 0; //统计遍历的次数
|
||||
while(reader.hasNext()) {
|
||||
XMLEvent event = reader.nextEvent();
|
||||
if(event.isStartElement()) {
|
||||
String name = event.asStartElement().getName().toString();
|
||||
if(name.equals("title")) {
|
||||
System.out.print("书籍[" + reader.getElementText() + "]");
|
||||
}
|
||||
if(name.equals("price")) {
|
||||
System.out.println("的价格为[" + reader.getElementText() + "]");
|
||||
}
|
||||
}
|
||||
iteratorNum++;
|
||||
}
|
||||
is.close();
|
||||
System.out.println("本次操作遍历XML的次数合计为[" + iteratorNum + "]次");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 基于XPath的方式解析XML
|
||||
*/
|
||||
@Test
|
||||
public void xpathParseXML() throws Exception {
|
||||
InputStream is = ClassLoader.getSystemResourceAsStream("books.xml");
|
||||
//创建文档处理对象
|
||||
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
||||
//通过DocumentBuilder创建doc的文档对象
|
||||
Document doc = db.parse(is);
|
||||
//创建XPath
|
||||
XPath xpath = XPathFactory.newInstance().newXPath();
|
||||
//第一个参数就是XPath表达式,第二参数就是文档..这里是查找所有属性为category="WEB"的<book>节点
|
||||
NodeList list = (NodeList)xpath.evaluate("//book[@category='WEB']", doc, XPathConstants.NODESET);
|
||||
for(int i=0; i<list.getLength(); i++) {
|
||||
Element e = (Element)list.item(i);
|
||||
//由于<book>节点下只会有一个<title>节点,所有这里是item(0)
|
||||
System.out.println(e.getElementsByTagName("title").item(0).getTextContent());
|
||||
System.out.println(e.getElementsByTagName("price").item(0).getTextContent());
|
||||
}
|
||||
is.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 使用XMLStreamWriter创建XML
|
||||
*/
|
||||
@Test
|
||||
public void xmlStreamWriterXML() throws XMLStreamException, FactoryConfigurationError {
|
||||
XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
|
||||
xsw.writeStartDocument("GBK","1.0");
|
||||
|
||||
String namespaceURI = "http://blog.csdn.net/jadyer";
|
||||
xsw.writeStartElement("pre", "uesr", namespaceURI); //再写<pre:uesr>
|
||||
xsw.writeStartElement("pre", "id", namespaceURI); //再写<pre:id>
|
||||
xsw.writeCharacters("1"); //再写1
|
||||
xsw.writeEndElement(); //再写</pre:id>
|
||||
|
||||
xsw.writeStartElement("pre", "name", namespaceURI); //再写<pre:name>
|
||||
xsw.writeCharacters("admin"); //再写admin
|
||||
xsw.writeEndElement();
|
||||
|
||||
|
||||
xsw.writeStartElement("pre", "age", namespaceURI); //再写<pre:age>
|
||||
xsw.writeCharacters("18"); //再写18
|
||||
xsw.writeEndElement();
|
||||
|
||||
|
||||
xsw.writeEndElement(); //再写</pre:uesr>
|
||||
|
||||
xsw.writeEndDocument(); //先写<?xml version="1.0" encoding="GBK"?>
|
||||
|
||||
xsw.flush();
|
||||
xsw.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 使用Transformer更新XML
|
||||
*/
|
||||
@Test
|
||||
public void transformerModifyXML() throws Exception, TransformerFactoryConfigurationError {
|
||||
InputStream is = ClassLoader.getSystemResourceAsStream("books.xml");
|
||||
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
||||
Document doc = db.parse(is);
|
||||
XPath xpath = XPathFactory.newInstance().newXPath();
|
||||
//查找内容含title="Learning XML"的<book>节点
|
||||
NodeList list = (NodeList)xpath.evaluate("//book[title='Learning XML']", doc, XPathConstants.NODESET);
|
||||
//获取<price>节点,这里只有一个符合条件的<book>节点,所以写成了list.item(0)
|
||||
Element e = (Element)(((Element)list.item(0)).getElementsByTagName("price").item(0));
|
||||
e.setTextContent("333.9");
|
||||
Transformer tran = TransformerFactory.newInstance().newTransformer();
|
||||
tran.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
||||
tran.setOutputProperty(OutputKeys.INDENT, "yes"); //让<?xml version=...?>与<bookestore>节点之间换行,默认不换行
|
||||
//修改节点
|
||||
tran.transform(new DOMSource(doc), new StreamResult(System.out));
|
||||
is.close();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bookstore>
|
||||
<book category="COOKING" aaaaaa="111111">
|
||||
<title lang="en">Everyday Italian</title>
|
||||
<author>Giada De Laurentiis</author>
|
||||
<year>2005</year>
|
||||
<price>30.00</price>
|
||||
</book>
|
||||
<book category="CHILDREN">
|
||||
<title lang="en">Harry Potter</title>
|
||||
<author>J K. Rowling</author>
|
||||
<year>2005</year>
|
||||
<price>29.99</price>
|
||||
</book>
|
||||
<book category="WEB">
|
||||
<title lang="en">XQuery Kick Start</title>
|
||||
<author>James McGovern</author>
|
||||
<author>Per Bothner</author>
|
||||
<author>Kurt Cagle</author>
|
||||
<author>James Linn</author>
|
||||
<author>Vaidyanathan Nagarajan</author>
|
||||
<year>2003</year>
|
||||
<price>49.99</price>
|
||||
</book>
|
||||
<book category="WEB">
|
||||
<title lang="en">Learning XML</title>
|
||||
<author>Erik T. Ray</author>
|
||||
<year>2003</year>
|
||||
<price>39.95</price>
|
||||
</book>
|
||||
</bookstore>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<config>
|
||||
<item date="January 2009">
|
||||
<mode>1</mode>
|
||||
<unit>900</unit>
|
||||
<current>1</current>
|
||||
<interactive>1</interactive>
|
||||
</item>
|
||||
<item date="February 2009">
|
||||
<mode>2</mode>
|
||||
<unit>400</unit>
|
||||
<current>2</current>
|
||||
<interactive>5</interactive>
|
||||
</item>
|
||||
<item date="December 2009">
|
||||
<mode>9</mode>
|
||||
<unit>5</unit>
|
||||
<current>100</current>
|
||||
<interactive>3</interactive>
|
||||
</item>
|
||||
</config>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<people>
|
||||
<person>
|
||||
<firstname>Lars</firstname>
|
||||
<lastname>Vogel</lastname>
|
||||
<city>Heidelberg</city>
|
||||
</person>
|
||||
<person>
|
||||
<firstname>Jim</firstname>
|
||||
<lastname>Knopf</lastname>
|
||||
<city>Heidelberg</city>
|
||||
</person>
|
||||
<person>
|
||||
<firstname>Lars</firstname>
|
||||
<lastname>Strangelastname</lastname>
|
||||
<city>London</city>
|
||||
</person>
|
||||
<person>
|
||||
<firstname>Landerman</firstname>
|
||||
<lastname>Petrelli</lastname>
|
||||
<city>Somewhere</city>
|
||||
</person>
|
||||
<person>
|
||||
<firstname>Lars</firstname>
|
||||
<lastname>Tim</lastname>
|
||||
<city>SomewhereElse</city>
|
||||
</person>
|
||||
</people>
|
||||
Reference in New Issue
Block a user