2006年12月13日星期三

dom4j的学习

dom4j 是一种解析 XML 文档的开放源代码 XML 框架。

参考google所有出来的关于dom4j的例子,自己学着写了两个范例,想用它来写文件存储器的索引文件。

1、首先下载dom4j的包,可以到http://dom4j.sourceforge.net/网站下载。

2、创建Document。
public Document createDocument()
{
    Document document = DocumentHelper.createDocument();
    document.addComment("索引文件管理列表!");
    Element root = document.addElement( "Root" );

    Element sysDir1 = root.addComment("存储文件工作目录")
        .addElement( "SysDir" ).addText("C:\\document\\aa\\");
    for(int i = 0;i<5;i++)
    {
        String guid = "***"+i;
        Element task1 = root.addElement( "Task" );
        Element guid1 = task1.addElement("GUID").addText(guid);
        Element proir1 = task1.addElement("Proir").addText((i+2)+"");
        Element status1 = task1.addElement("Status").addText((i+5)+"");
        Element isSend1 = task1.addElement("IsSend").addText("true");
    }

    return document;
}


3、生成XML文件。
public boolean CreatXML(Document doc)
{
    boolean ret = false;
    try
    {
        //输出数据到XML文件中
        OutputFormat format = OutputFormat.createPrettyPrint();
        //xml文件字符集为GBK
        format.setEncoding("GBK");
        FileOutputStream fos = new FileOutputStream("d:\\content.xml");
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos , "GBK"));
        XMLWriter writer = new XMLWriter(bw , format);
        writer.write(doc);
        bw.close();
        ret = true;
    }catch(Exception ex)
    {
        System.out.println(ex.toString());
    }
    return ret;
}


4、读取XML文件。
public Document read(String fileName) throws MalformedURLException, DocumentException
{
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File(fileName));
    return document;
}


5、测试例子
public static void main(String s[])
{
    dom4jmain xml=new dom4jmain();
    Document doc = xml.createDocument();
    xml.CreatXML(doc);        
    
    try
    {
        Document doc1 = xml.read("D:\\content.xml");
        Element root = xml.getRootElement(doc1);
        boolean isDel = false;
        for(int i =0; i < root.nodeCount(); i ++)
        {
            Node node = root.node(i);
            String nodexml = node.asXML();
            if(nodexml.trim().equals("")) continue;
            
            if (node instanceof Element)
            {
                if(node.getName().equals("Task"))
                {
                    System.out.println("///////////////////////");
                    System.out.println(node.asXML());
                    Element enode = (Element)node;
                    String guid = "";
                    for(int j =0; j < enode.nodeCount(); j ++)
                    {
                        Node chnode = enode.node(j);
                        nodexml = chnode.asXML();
                        if(nodexml.trim().equals("")) continue;
                        
                        //获取GUID
                        if(chnode.getName().equals("GUID"))
                        {
                            guid = chnode.getText();
                        }
                        
                        //修改属性
                        if(guid.equals("***1") && chnode.getName().equals("IsSend"))
                        {
                            chnode.setText("false");
                        }
                        
                        //删除节点设置
                        if(guid.equals("***2"))
                        {
                            isDel = true;
                        }
                        System.out.println("<Task>"+chnode.getName()+"="+chnode.getText());
                    }
                }
                else if(node.getName().equals("SysDir"))
                {
                    System.out.println("<SysDir>"+node.getName()+"="+node.getText());                
                }
            }
            
            //删除节点
            if(isDel)
            {
                root.remove(node);
                isDel = false;
            }
        }
        
        //增加节点
        Element task1 = root.addElement( "Task" );    
        Element guid1 = task1.addElement("GUID").addText("newguid");
        Element proir1 = task1.addElement("Proir").addText("0");
        Element status1 = task1.addElement("Status").addText("a");
        Element isSend1 = task1.addElement("IsSend").addText("true");
        
        xml.CreatXML(doc1);
    }
    catch(Exception ex)
    {}        
}


6、附:测试的两个文件,dom4jmain.java和dom4jtest.java
dom4jmain.java 文件。
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.io.SAXReader;
import java.io.*;
import java.net.*;

public class dom4jmain
{
    public dom4jmain()
    {
    }

    public Document createDocument()
    {    
        Document document = DocumentHelper.createDocument();
        document.addComment("索引文件管理列表!");
        Element root = document.addElement( "Root" );

        Element sysDir1 = root.addComment("存储文件工作目录")
            .addElement( "SysDir" ).addText("C:\\document\\aa\\");
for(int i = 0;i<5;i++)
{
    String guid = "***"+i;
    Element task1 = root.addElement( "Task" );    
    Element guid1 = task1.addElement("GUID").addText(guid);
    Element proir1 = task1.addElement("Proir").addText((i+2)+"");
    Element status1 = task1.addElement("Status").addText((i+5)+"");
    Element isSend1 = task1.addElement("IsSend").addText("true");
}

return document;
    }
    
    public boolean CreatXML(Document doc)
    {
        boolean ret = false;
        try
        {
            //输出数据到XML文件中
            OutputFormat format = OutputFormat.createPrettyPrint();
            //xml文件字符集为GBK
            format.setEncoding("GBK");
            FileOutputStream fos = new FileOutputStream("d:\\content.xml");
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos , "GBK"));
            XMLWriter writer = new XMLWriter(bw , format);
            writer.write(doc);
            bw.close();
            ret = true;
        }catch(Exception ex)
        {
            System.out.println(ex.toString());
        }
        return ret;
    }
    
    public Document read(String fileName) throws MalformedURLException, DocumentException
    {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(fileName));
        return document;         
    }
    
    public Element getRootElement(Document doc)
    {
        return doc.getRootElement();
    }
}



dom4jtest.java 文件。
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;

public class dom4jtest {
    public static void main(String s[])
    {
        dom4jmain xml=new dom4jmain();
        Document doc = xml.createDocument();
        xml.CreatXML(doc);        
        
        try
        {
            Document doc1 = xml.read("D:\\content.xml");
            Element root = xml.getRootElement(doc1);
            boolean isDel = false;
            for(int i =0; i < root.nodeCount(); i ++)
            {
                Node node = root.node(i);
                String nodexml = node.asXML();
                if(nodexml.trim().equals("")) continue;
                
                if (node instanceof Element)
                {
                    if(node.getName().equals("Task"))
                    {
                        System.out.println("///////////////////////");
                        System.out.println(node.asXML());
                        Element enode = (Element)node;
                        String guid = "";
                        for(int j =0; j < enode.nodeCount(); j ++)
                        {
                            Node chnode = enode.node(j);
                            nodexml = chnode.asXML();
                            if(nodexml.trim().equals("")) continue;
                            
                            //获取GUID
                            if(chnode.getName().equals("GUID"))
                            {
                                guid = chnode.getText();
                            }
                            
                            //修改属性
                            if(guid.equals("***1") && chnode.getName().equals("IsSend"))
                            {
                                chnode.setText("false");
                            }
                            
                            //删除节点设置
                            if(guid.equals("***2"))
                            {
                                isDel = true;
                            }
                            System.out.println("<Task>"+chnode.getName()+"="+chnode.getText());
                        }
                    }
                    else if(node.getName().equals("SysDir"))
                    {
                        System.out.println("<SysDir>"+node.getName()+"="+node.getText());                
                    }
                }
                
                //删除节点
                if(isDel)
                {
                    root.remove(node);
                    isDel = false;
                }
            }
            
            //增加节点
            Element task1 = root.addElement( "Task" );    
     Element guid1 = task1.addElement("GUID").addText("newguid");
     Element proir1 = task1.addElement("Proir").addText("0");
     Element status1 = task1.addElement("Status").addText("a");
     Element isSend1 = task1.addElement("IsSend").addText("true");
            
            xml.CreatXML(doc1);
        }
        catch(Exception ex)
        {}        
    }
}


7、测试结果
打印出下面的输出结果,同时会在D:\下创建一个content.xml的文件。
<SysDir>SysDir=C:\document\aa\
///////////////////////
<Task>
        <GUID>***0</GUID>
        <Proir>2</Proir>
        <Status>5</Status>
        <IsSend>true</IsSend>
    </Task>
<Task>GUID=***0
<Task>Proir=2
<Task>Status=5
<Task>IsSend=true
///////////////////////
<Task>
        <GUID>***1</GUID>
        <Proir>3</Proir>
        <Status>6</Status>
        <IsSend>true</IsSend>
    </Task>
<Task>GUID=***1
<Task>Proir=3
<Task>Status=6
<Task>IsSend=false
///////////////////////
<Task>
        <GUID>***2</GUID>
        <Proir>4</Proir>
        <Status>7</Status>
        <IsSend>true</IsSend>
    </Task>
<Task>GUID=***2
<Task>Proir=4
<Task>Status=7
<Task>IsSend=true
///////////////////////
<Task>
        <GUID>***3</GUID>
        <Proir>5</Proir>
        <Status>8</Status>
        <IsSend>true</IsSend>
    </Task>
<Task>GUID=***3
<Task>Proir=5
<Task>Status=8
<Task>IsSend=true
///////////////////////
<Task>
        <GUID>***4</GUID>
        <Proir>6</Proir>
        <Status>9</Status>
        <IsSend>true</IsSend>
    </Task>
<Task>GUID=***4
<Task>Proir=6
<Task>Status=9
<Task>IsSend=true

没有评论: