所涉及的jar包位于 jre/lib/rt.jar
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
InputSource功能:
此类允许 SAX 应用程序封装有关单个对象中的输入源的信息,它可包括公共标识符、系统标识符、字节流(可能带有指定的编码)、基本 URI 和/ 或字符流。
在以下两种情况下应用程序可以将输入源提供给解析器:作为 Parser.parse 方法的参数,或者作为 EntityResolver.resolveEntity 方法的返回值。
SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入。如果有字符流可用,则解析器将直接读取该流,而忽略该流中找到的任何文本编码声明。如果没有字符流,但却有字节流,则解析器将使用该字节流,从而使用在 InputSource 中指定的编码,或者另外(如果未指定编码)通过使用某种诸如 XML 规范 中的算法算法自动探测字符编码。如果既没有字符流,又没有字节流可用,则解析器将尝试打开到由系统标识符标识的资源的 URI 连接。
InputSource 对象属于该应用程序:SAX 解析器将不会以任何方式修改它(它可以在必要时修改副本)。但是,作为解析终止清除的一部分,对字节流和字符流的标准处理就是关闭这二者,因此在将此类流传递给解析器后应用程序不应尝试重新使用它们。
spring源码中:org.springframework.beans.factory.xml.DefaultDocumentLoader
实现了对Document、DocumentBuilderFactory、DocumentBuilder创建方式
1、创建xml文件的方式:
.获取Document对象->创建Element跟元素( doc.createElement(“”));->将根元素添加到Document对象中-》通过Element的setAttribute方法设置属性值(如果有子节点,还是
通过doc.createElement创建子根元素,然后把子根元素放到根元素中
代码示例:
Document doc = domBuilder.newDocument() ;
Element ctmlEntry = doc.createElement(XMLTAG_CTML) ;
doc.appendChild(ctml) ;
ctmlEntry.setAttribute(XMLTAG_ID, this.id);
ctmlEntry.setAttribute(XMLTAG_NAME, this.name);
ctmlEntry.setAttribute(XMLTAG_PROPERTY, this.property);
ctmlEntry.setAttribute(XMLTAG_STATUS, this.status);
ctmlEntry.setAttribute(XMLTAG_DESCRIPTION, this.desc);
ctmlEntry.setAttribute(XMLTAG_CREATE_TIME, Long
.toString(this.createTime));
Element policyList = doc.createElement(XMLTAG_POLICY_LIST);
ctmlEntry.appendChild(policyList);
2、将创建的xml格式的数据转化成byte数组
javax.xml.transform.Transformer transformer = TransformerFactory.newInstance()
.newTransformer() ;
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8") ;
transformer.setOutputProperty(OutputKeys.INDENT, "yes") ;
ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
StreamResult streamResult = new StreamResult(bos) ;
transformer.transform(new DOMSource(doc), streamResult) ;
return bos.toByteArray() ;
3\将byte数组转化成xml格式的数据
javax.xml.transform.dom.DOMResult docResult = new DOMResult() ;
transformer.transform(new StreamSource(new ByteArrayInputStream(
data)), docResult) ;
Document doc = (Document) docResult.getNode() ;
4\读取xml数据
生成根元素->获取根元素的节点列表-》将节点列表中的数据并转化成根元素Element-》通过根元素的getAttribute获取属性值,hasAttribute判断是否有属性
代码示例:org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader
Element root = doc.getDocumentElement();
NodeList nl = root.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element) node;
String location = ele.getAttribute(RESOURCE_ATTRIBUTE);
}
}