XML文件解析大杂烩

[align=center][b][size=medium]XML文件解析总结[/size][/b][/align]
一、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());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值