java与XML文件的读写

DOMDocument Object Model的缩写,即文档对象模型。前面说过,XML将数据组织为一颗树,所以DOM就是对这颗树的一个对象描叙。通俗的说,就是通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML文档的内容。
下面我们来看一个简单的例子,看看在DOM中,我们是如何来操作一个XML文档的。
这是一个XML文档,也是我们要操作的对象:
下面,我们需要把这个文档的内容解析到一个个的Java对象中去供程序使用,利用JAXP,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:
我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体
使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。这个工厂模式的具体实现,可以参看下面的类图。当获得一个工厂对象后,使用它的静态方法newDocumentBuilder() 方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。
DOM详解
DOM的基本对象有5个:DocumentNodeNodeListElementAttr。下面就这些对象的功
能和实现的方法作一个大致的介绍。
Document
对象代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document
String message = my_node.getFirstChild().getNodeValue();
1
.基本的DOM对象
对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。此外,Document还包含了创建其它节点的方法,比如createAttribut()用来创建一个Attr对象。它所包含的主要的方法有:
createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。
createElement(String)
:用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。
createTextNode(String)
:用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。
getElementsByTagName(String)
:返回一个NodeList对象,它包含了所有给定标签名字的标签。getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。
Node
对象是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点。在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如ElementAttrTextNode对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点,这一点是要注意的。Node对象所包含的主要的方法有: appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。
getNextSibling()
返回在DOM 树中这个节点的下一个兄弟节点,对等的,还有
getPreviousSibling()
方法返回其前一个兄弟节点。
getNodeName()
:根据节点的类型返回节点的名称。
getNodeType()
:返回节点的类型。
getNodeValue()
:返回节点的值。
hasChildNodes()
:判断是不是存在有子节点。
hasAttributes()
:判断这个节点是否存在有属性。
getOwnerDocument()
:返回节点所处的Document对象。
insertBefore(org.w3c.dom.Node new
org.w3c.dom.Node ref):在给定的一个子对象前再插入一个子对象。
removeChild(org.w3c.dom.Node)
:删除给定的子节点对象。
replaceChild(org.w3c.dom.Node new
org.w3c.dom.Node old):用一个新的Node对象代替给定的子节点对象。
NodeList
对象,顾名思义,就是代表了一个包含了一个或者多个Node的列表。可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素:
GetLength():返回列表的长度。
Item(int)
:返回指定位置的Node对象。
Element
对象代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。
getElementsByTagName(String)
:返回一个NodeList对象,它包含了在这个标签中其下的子孙
节点中具有给定标签名字的标签。
getTagName()
:返回一个代表这个标签名字的字符串。
getAttribute(String)
:返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML
文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到
getAttributeNodes()
方法来得到一个Attr对象来进行进一步的操作。
getAttributeNode(String)
:返回一个代表给定属性名称的Attr对象。
Attr
对象代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element
的,它并不能被看作是Element的子对象,因而在DOMAttr并不是DOM树的一部分,所以Node
中的getparentNode()getpreviousSibling()getnextSibling()返回的都将是null。也就是说,
Attr
其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。
这一点在使用的时候要同其它的Node子对象相区别。
需要说明的是,上面所说的DOM对象在DOM中都是用接口定义的,在定义的时候使用的是与
具体语言无关的IDL语言来定义的。因而,DOM其实可以在任何面向对象的语言中实现,只要
它实现了DOM所定义的接口和功能就可以了。同时,有些方法在DOM中并没有定义,是用IDL
的属性来表达的,当被映射到具体的语言时,这些属性被映射为相应的方法。
有了上面的介绍,相信你对DOM理解的更多了吧。下面的例子将让你对DOM更加熟悉起来。
 
package com.dzf.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/** *//**
 * 
@author dengzhifeng
 * 
 
*/

public class Writexml ...{
    
private Document document;

    
private String filename;

    
private boolean validating;

    
public Writexml(String name) throws ParserConfigurationException ...{
        filename 
= name;
        DocumentBuilderFactory factory 
= DocumentBuilderFactory.newInstance();
        DocumentBuilder builder 
= factory.newDocumentBuilder();
        document 
= builder.newDocument();
    }


    
public Vector toRead(String filename) ...{
        Vector title 
= new Vector();
        Vector content 
= new Vector();
        String myStr 
= new String();
        
try ...{
            DocumentBuilderFactory factory 
= DocumentBuilderFactory
                    .newInstance();
            factory.setValidating(validating);
            DocumentBuilder builder 
= factory.newDocumentBuilder();
            document 
= builder.parse(new File(filename));
            document.getDocumentElement().normalize();
            Node node 
= document.getFirstChild();
            NodeList list 
= node.getChildNodes();
            
for (int i = 0; i < list.getLength(); i++...{
                Node nodeitm 
= list.item(i);
                
if (nodeitm.getNodeName().equals("Title")) ...{
                    myStr 
= nodeitm.getFirstChild().getNodeValue();
                    title.addElement(myStr);
// getFirstChild()
                }

                
if (nodeitm.getNodeName().equals("Content")) ...{
                    myStr 
= nodeitm.getFirstChild().getNodeValue();
                    content.addElement(myStr);
                }

            }

        }
 catch (Exception exp) ...{
            exp.printStackTrace();
            
return null;
        }

        Vector all 
= new Vector();
        all.add(title);
        all.add(content);
        
return all;
    }


    
public void toWrite(String mytitle, String mycontent) ...{
        Element root 
= document.createElement("D");
        document.appendChild(root);
        Element segment 
= document.createElement("RH");
        root.appendChild(segment);
        Element H_segment 
= document.createElement("CH");
        H_segment.setAttribute(
"Name""FCon_number");
        H_segment.setAttribute(
"Type""string");
        H_segment.setAttribute(
"Value""编码");
        H_segment.setAttribute(
"Visible""false");
        H_segment.setAttribute(
"Readonly""true");
        segment.appendChild(H_segment);
        Element H_segment1 
= document.createElement("CH");
        H_segment1.setAttribute(
"Name""FName");
        H_segment1.setAttribute(
"Type""string");
        H_segment1.setAttribute(
"Value""条件名称");
        H_segment1.setAttribute(
"Visible""true");
        H_segment1.setAttribute(
"Readonly""true");
        segment.appendChild(H_segment1);
        Element H_segment2 
= document.createElement("CH");
        H_segment2.setAttribute(
"Name""FCon_exp");
        H_segment2.setAttribute(
"Type""string");
        H_segment2.setAttribute(
"Value""条件");
        H_segment2.setAttribute(
"Visible""true");
        H_segment2.setAttribute(
"Readonly""true");
        segment.appendChild(H_segment2);
        Element H_segment3 
= document.createElement("CH");
        H_segment3.setAttribute(
"Name""FCon_sum");
        H_segment3.setAttribute(
"Type""string");
        H_segment3.setAttribute(
"Value""结论");
        H_segment3.setAttribute(
"Visible""true");
        H_segment3.setAttribute(
"Readonly""flase");
        segment.appendChild(H_segment3);
        Element title 
= document.createElement("Title");
        title.appendChild(document.createTextNode(mytitle));
        root.appendChild(title);
        Element title1 
= document.createElement("Title");
        title1.appendChild(document.createTextNode(
"title1"));
        root.appendChild(title1);
        Element content 
= document.createElement("Content");
        content.appendChild(document.createTextNode(mycontent));
        content.appendChild(document.createTextNode(
"content1"));
        root.appendChild(content);
        Writexml.save(root);
    }


    
public static void save(Node doc) ...{
        StringWriter mysw 
= new StringWriter();
        
// //System.out.println("doc===="+doc);
        if (doc != null...{
            
try ...{
                TransformerFactory transFact 
= TransformerFactory.newInstance();
                Transformer trans 
= transFact.newTransformer();
                doc.normalize();
                trans.transform(
new DOMSource(doc), new StreamResult(mysw));
                System.out.println(mysw.toString());
            }
 catch (TransformerConfigurationException tce) ...{
                tce.printStackTrace(System.err);
            }
 catch (TransformerException te) ...{
                te.printStackTrace(System.err);
            }

        }

        
// return "";
    }


    
public void toSave() ...{
        
try ...{
            TransformerFactory tf 
= TransformerFactory.newInstance();
            Transformer transformer 
= tf.newTransformer();
            DOMSource source 
= new DOMSource(document);
            transformer.setOutputProperty(OutputKeys.ENCODING, 
"GB2312");
            transformer.setOutputProperty(OutputKeys.INDENT, 
"yes");
            PrintWriter pw 
= new PrintWriter(new FileOutputStream(filename));
            StreamResult result 
= new StreamResult(pw);
            transformer.transform(source, result);
        }
 catch (TransformerException mye) ...{
            mye.printStackTrace();
        }
 catch (IOException exp) ...{
            exp.printStackTrace();
        }

    }


    
public static void main(String args[]) ...{
        
try ...{
            Writexml myxml 
= new Writexml("f:/write.xml");
            myxml.toWrite(
"中文题目""中文内容");
            myxml.toSave();
            System.out.println(
"Your writing is successful.");
            Vector v 
= myxml.toRead("f:/write.xml");
            
for (int i = 0; i < v.size(); i++...{
                System.out.println(v.elementAt(i));
            }

        }
 catch (ParserConfigurationException exp) ...{
            exp.printStackTrace();
            System.out.print(
"Your writing is failed.");
        }

    }

}


阅读更多
个人分类: java
想对作者说点什么? 我来说一句

java读写xml文件

2011年11月12日 10KB 下载

java读取和写入xml文件

2017年02月27日 446KB 下载

java读写XML文件

2008年07月03日 225KB 下载

C#读写XML文件 .pdf

2010年11月17日 54KB 下载

o-x-mapping测试

2009年04月02日 4.68MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭