xml听说发明出来就是为了替换html的,可是这貌似已经不可能了,毕竟html5都出来了。
按照我的学习理解,xml的编写需要按照一定的规则,这个规则有DTD,有XML Schema,不过DTD在数据约束上不是很严谨,估计逃不掉被淘汰的命运。
然后就是对xml的解析,xml的解析分为两种,一是dom解析,二是sax解析。dom解析是w3c公司推荐用的,但是几乎所有的解析包都支持用sax来解析xml,dom解析必须先获取这个文档才能进行操作,且dom占用的内存大容易溢出,相反sax是可以读一部分操作一部分,占用内存小。解析器有那些就不记得了,但是解析包大致有三种,分别是jaxp,jdom,dom4j,dom4j经过前辈牛人的测试听说是最好的。jaxp的解析在dom和sax上都是调用w3c的包来进行解析,而dom4j是调用下载下来的dom4j的jar包才能解析。dom4j解析和jaxp不同,jaxp是先创建工厂解析器,然后创建解析器,再创建文档对象,中间部分就是crud文档,最后就是把crud写到文档中去,具体如下:
dom解析:
//得到dom解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到默认解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//得到文档
Ducument document = builder.parse("***.xml");
//进行crud操作
.........................
.........................
//得到转换工厂
TransformerFactory tffactory=TransformerFactory.newInstance();
//得到转换器
Transformer transformer=tffactory.newTransformer();
//进行转换写入
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
sax解析
//使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf =SAXParserFactory.newInstance();
//通过SAX解析工厂得到解析器对象
SAXParser sp=spf.newSAXParser();
///通过解析器对象得到一个XML的读取器
XMLReader xmlReader=sp.getXMLReader();
//设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
//解析xml文件
xmlReader.parse("book.xml");
如上,sax解析的时候要自定义一个事件处理器BookParserHandler之类,一般情况下要继承DefaultHandler ,并实现其中的startElement,chracters和endElement三个函数用来操作数据(文档)。
而dom4j的解析获取文档有三种方法,如下:
1.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document =reader.read(new File("input.xml"));
String text = "<members></members>";
Document document=DocumentHelper.parseText(text);
3.主动创建document对象
Document document= DocumentHelper.createDocument();
Element root = document.addElement("members");
获取对象之后就是操作数据,dom4j文档上基本都已列出,最后就是写入xml,其中很重要的一点是编码问题
,在设置文档格式的时候可指定,具体如下:
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); // 指定XML编码
XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
end~