您的位置:首页 > 其它

XML解析及相关问题

2016-07-30 14:27 204 查看
常见的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

<,>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息