XML解析及相关问题

前端之家收集整理的这篇文章主要介绍了XML解析及相关问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

常见的XML解析方式主要有jdom,sax等,不过jdom貌似用的更多点。

在开发中,我们可能会碰到XML解析相关的问题,至于xml结构定义相关的错误就不提了,无非就是多了空格,差个收尾标签之类的低级错误,相信你仔细找找肯定能发现症结所在。这里,我们就谈谈XML无法解析特殊字符的解决方法

我们知道,XML解析器的解析原理肯定是利用一些特殊的标记符来分离XML文档中,基本的XML标签元素和标签内容的。完整的标签都是以<></>这种方式定义的,那么作为组成元素之一的'<'和'>',毫无疑问会被解析器特殊处理,说的书面一点,'<'和'>'就是XML中的预定义实体引用。XML中一共有五个类似的特殊实体引用:


那么如果我们想读取XML文件中这些特殊符号该怎么处理呢?比如'1<4',解析的时候肯定报语法错误了。

现在有两种解决方法

1.用实体引用代替符号

2.使用CDATA处理特殊字符(CDATA 指的是不由 XML 解析器进行解析的文本数据)

值得注意的是,CDATA的文本内容中不能出现字符串“]]>”,且不可嵌套使用。

下面有个实例程序可供参考:

package jj.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class TestPushBackInputStream {
	public static void main(String[] args) {
		testXML();
	}
	public static void testXML() {
		try {
			String path = "E:/xml01.xml";
			SAXBuilder sb = new SAXBuilder();
			InputStreamReader isr = new InputStreamReader(new FileInputStream(path),"gbk");
			//Document doc1 = sb.build(new File(path));这种方式简单,但可能会碰到乱码问题
			Document doc = sb.build(isr);
			Element ele = doc.getRootElement();
			List<Element> eL = ele.getChildren("p");
			for (Element e : eL) {
				System.out.println("#####");
				System.out.println(e.getAttributeValue("name"));
				System.out.println(e.getText());
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JDOMException e) {
			e.printStackTrace();
		}
	}
}

相关的XML文件如下:
<?xml version="1.0" encoding="gbk"?>
<table>
	<p name="姜哥哥">帅帅哒!</p>
	<p name="特殊字符">><&"</p>
	<p name="CDATA"><![CDATA[<,>]]></p>
</table>

解析出的效果如下:

##### 姜哥哥 帅帅哒! ##### 特殊字符 ><&" ##### CDATA <,>

猜你在找的XML相关文章