Java_xml_Dom解析实现增删改查

来源:互联网 发布:江山人才招聘21js 编辑:程序博客网 时间:2024/06/03 12:47
本博文为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/12094775

1.Node准备

Node接口是整个文档对象模型的主要数据类型,它表示该文档树中的单个节点。例如Attr, CharacterData, Comment, Text,Element都是Node的子类。 xml解析的误区: 在xml文件解析过程中,所有信息都被当做一个对象,例如解析下面的语句

/* * <book>AAA<name>java语法</name>BBB</book> * 该book下的直接子节点有3个,AAA和BBB被解析为CharacterData类型的节点,<name>被解析为Element类型的节点, *  * <book> <name>java语法</name> </book> * 该book下的直接子节点有3个,由于在<name>之前有个换行,CharacterData类型的节点 * <book><name>java语法</name></book> 该book下的直接子节点只有1个 */

2.Dom解析优缺点

优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。

缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

3.Dom解析xml

/** * 解析xml文件,遍历并所有信息 */public static void parseXMl() {try {// 1.通过DocumentBuilder工厂得到对应的xml解析器DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();// 2.通过解析器得到Document对象Document doc = builder.parse("d:/my.xml");// 3.解析数据/* * <book> * <name>javaWeb</name> * <author>fanglx</author>  * <price>30.90</price>  * </book> *///得到所有的book的标签的nodelistNodeList nodeList = doc.getElementsByTagName("book");//遍历每个book节点for(int i=0; i<nodeList.getLength(); i++){Node node = nodeList.item(i);//当前遍历的book节点//得到该book节点下的所有的直接子节点NodeList childNodes = node.getChildNodes();for(int j=0; j<childNodes.getLength(); j++){Node childNode = childNodes.item(j);//如果当前的childNode节点是一个标签,CharacterData类型的文本节点则不执行if(childNode instanceof Element){String fieldName = childNode.getNodeName();//当前节点名称 比如authorString value = childNode.getTextContent();//当前节点的text值比如fanglx/* * 或者下面方式得到value值 * String value = childNode.getFirstChild().getNodeName();//fanglx */System.out.println(fieldName+"="+value);//author=fanglx}}}} catch (Exception e) {e.printStackTrace();}}
/** * 对xml文件的更新 */public static void updateXMl() {try {// 1.通过DocumentBuilder工厂得到对应的xml解析器DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();// 2.通过解析器得到Document对象Document doc = builder.parse("d:/my.xml");// 3.更新数据/* * <book> * <name>javaWeb</name> * <author>fanglx</author>  * <price>30.90</price>  * </book> */NodeList nodeList = doc.getElementsByTagName("book");Element parentEle = (Element) nodeList.item(0);//直接在子标签的尾部增加<num id="1001">25</num>Element childEle = doc.createElement("num");childEle.setAttribute("id", "1001");//设置属性childEle.setTextContent("25");//设置值parentEle.appendChild(childEle);//直接在price标签前面增加<age id="25">mm</age>Element newChild = doc.createElement("age");newChild.setAttribute("id", "25");//设置属性newChild.setTextContent("mm");//设置值Element refChild = (Element) parentEle.getElementsByTagName("price").item(0);parentEle.insertBefore(newChild, refChild);// 4.保存更新的数据TransformerFactory tFactory = TransformerFactory.newInstance();Transformer transformer = tFactory.newTransformer();transformer.transform(new DOMSource(doc), new StreamResult(new File("c:/my.xml")));} catch (Exception e) {e.printStackTrace();}}
<?xml version="1.0" encoding="UTF-8" standalone="no"?><books>   <book>   <name>javaWeb</name>    <author>fanglx</author><price>30.90</price>      </book></books>

原创粉丝点击