首页 > 代码库 > XML处理
XML处理
1)CDATA部分用<![CDATA[和]]>来限定其界限,它们是字符数据的一种特殊形式,可用使用它们来囊括那些含有<、>,&之类字符的字符串,而不必将它们解释为标记例如:<![CDATA[<]]>,另外需要注意的是CDATA部分不能包含字符串]]>。
2)处理指令(processing instruction)专门处理XML文档的应用程序中使用的指令,它们用<?和?>来限定其界限。例如:<?xml version="1.0"?>。
3)注释 使用<!--和-->限定其界限。
4)解析XML文档有两种类型的解析器一种是树形解析器(DOM),另外一种流机制解析器(SAX),首先介绍树形解析器。
包名:org.w3c.dom
DOM解析器的接口已经被W3C标准化,org.w3c.dom包包含了解析时用各种对象以及方法。解析xml文档首先要创建Document对象,如何创建请看例子:
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc=builder.parse(f);
parse方法中的参数可以是文件或者是流,可以通过调用getDocumentElement方法获取xml文档的根元素,调用getTagName()获取元素的名字,getChildNodes()获取节点列表NodeList,调用getTextContent()获取元素的文本值。
例子:
//根元素 Element root=doc.getDocumentElement(); // 返回节点的集合 NodeList nodeList=root.getChildNodes(); // 返回集合中子节点数 int count=nodeList.getLength(); //获取元素的名字 String rootName=root.getTagName(); //获取元素的文本值包括其子元素 String rootText=root.getTextContent();
可用instanceof判断节点是否是元素,由于Text类型的节点是终结节点,可以用getData获取Text节点中的字符串,对getData返回的值最好调用trim方法,过滤掉空字符。
for (int i = 0; i < nodeList.getLength(); i++) { //获取单个节点 Node childNode = nodeList.item(i); //判断是否是元素, if (childNode instanceof Element) { Element element = (Element) childNode; //childNode只有一个子节点且子节点是Text类型的 例子:<name>zhangsan<name> //Text节点是指的"zhangsan"节点 Text textNode = (Text) element.getFirstChild(); //调用getData获取其文本值 String textString = textNode.getData().trim(); } else{ // TODO 其他处理 }
5)XPath定位信息
包名:javax.xml.xpath.XPath
获取XML文档中某一节点的值,如果遍历整个DOM树的节点来查找比较麻烦的,但是使用XPath语言可以轻松的得到指定的节点值或属性值。
XPath可以描述XML文档中一个节点的集,例如,XPath:/gridbag/row,描述了根元素gridbag的子元素中所有的row元素,可以用[]操作符来选择特定的元素:/gridbag/row[1]这表示的是第一行(索引号从1开始),使用@操作符可以获得属性值,例如:/gridbag/row[1]/@anchor,获取第一行row元素属性anchor的值。
XPath表达式是如何创建和使用的,接下来看一段代码就会明白了:
XPathFactory xPathFactory=XPathFactory.newInstance(); XPath xPath=xPathFactory.newXPath(); //evaluate 返回的是字符串,所以很适合用来获取文本值 String value= http://www.mamicode.com/xPath.evaluate("/gridbag/row[1]", doc);
evaluate第一个参数XPath表达式,第二参数是DOM对象。
6)流机制解析器
包名:javax.xml.stream
StAX解析器是一种“拉解析器(pull parser)”,使用下面的基本循环来迭代所有的事件即可:
InputStream in=new FileInputStream("G:\\test.xml"); XMLInputFactory factory=XMLInputFactory.newInstance(); XMLStreamReader parser=factory.createXMLStreamReader(in); while (parser.hasNext()) { // event 对应事件的值 int event=parser.next(); // 元素 处理 if (event==XMLStreamConstants.START_ELEMENT) {
String elementNameString=parser.getLocalName();// 元素名称
String elementValueString=parser.getText();// 元素值
// TODO
} // Call parser methods obtain event details }
7)生成XML文档
//TODO...
XML处理