使用xom实现xml文件数据的查找,删除,修改(完整beta版,daya原创)

来源:互联网 发布:南大网络教育答案2017 编辑:程序博客网 时间:2024/04/29 10:23
说明:
1,程序需要安装第三方jar包,即xom的jar包可以在http://www.cafeconleche.org/XOM/找到相关下载链接进行下载
2,程序分为三部分,CreateMapXml.java是这个小demo的核心处理程序,封装了对mapdata.xml文件中相关内容的插入查找删除等行为。mapdata.xml文件的根节点为<map>,它下面是
    <mapdata>
        <positionID>1c</positionID>
        <longitude>1c</longitude>
        <latitude>1c</latitude>
    </mapdata>
大体结构就是这样的。InputGui.java是demo的界面类,并自带主函数,主要显示了输入的区域标识,经度,纬度,在输入区域标识值触发信息查找事件,如果存在匹配值则在经度纬度输入框内即可显示相关信息,添加/修改按钮也会变为修改,删除按钮可用,已完成对信息的修改,如果没有匹配内容,则按钮不可编辑,直到用户输入完整的新的id,经纬度等信息后,按钮会变为添加,其余自验吧,嘿嘿
3,直接贴代码了.....
//InputGui.java
package mapData;

import static gui.SwingConsole.run;



import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.ParsingException;
import nu.xom.ValidityException;

public class InputGui extends JFrame {
private JButton
b1 = new JButton("修改/添加"),
b2 = new JButton("删除");
private JTextField
t1 = new JTextField(20),
t2 = new JTextField(20),
t3 = new JTextField(20);
private JLabel
label1 = new JLabel("ID"),
label2 = new JLabel("经度"),
label3 = new JLabel("纬度");
private String s = "";
private UpperCaseDocument ucd1 = new UpperCaseDocument();
private UpperCaseDocument ucd2 = new UpperCaseDocument();
private UpperCaseDocument ucd3 = new UpperCaseDocument();
public InputGui() {
t1.setDocument(ucd1);
ucd1.addDocumentListener(new T1());
t2.setDocument(ucd2);
ucd2.addDocumentListener(new T2());
t3.setDocument(ucd3);
ucd3.addDocumentListener(new T2());

b1.addActionListener(new B1());

b2.addActionListener(new B2());
/*t1.addActionListener(new T1A());*/

setLayout(new GridLayout(4,2));

add(label1);
add(t1);
add(label2);
add(t2);
add(label3);
add(t3);
add(b1);
add(b2);

b1.setEnabled(false);
b2.setEnabled(false);

}

class T1 implements DocumentListener {
public void changedUpdate(DocumentEvent e) {
}

public void insertUpdate(DocumentEvent e) {
//t2.setText(t1.getText());
//t3.setText("Text: " + t1.getText());
//b1.setEnabled(false);
try {
MapBean mapMessage = (new CreateMapXml()).searchElement(t1.getText());
if((mapMessage.getLatitude()!=null)
&&(mapMessage.getLongitude()!=null)
&&(!mapMessage.getLatitude().equals(""))
&&(!mapMessage.getLongitude().equals(""))){
t2.setText(mapMessage.getLongitude());
t3.setText(mapMessage.getLatitude());
b1.setText("修改");
b1.setEnabled(false);
b2.setEnabled(true);
}else{
b1.setText("添加");
t2.setText("");
t3.setText("");
b1.setEnabled(false);
b2.setEnabled(false);
}
} catch (ValidityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParsingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

public void removeUpdate(DocumentEvent e) {
try {
MapBean mapMessage = (new CreateMapXml()).searchElement(t1.getText());
if((mapMessage.getLatitude()!=null)
&&(mapMessage.getLongitude()!=null)
&&(!mapMessage.getLatitude().equals(""))
&&(!mapMessage.getLongitude().equals(""))){
t2.setText(mapMessage.getLongitude());
t3.setText(mapMessage.getLatitude());
b1.setText("修改");
b1.setEnabled(false);
b2.setEnabled(true);
}else{
b1.setText("添加");
t2.setText("");
t3.setText("");
b1.setEnabled(false);
b2.setEnabled(false);
}
} catch (ValidityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParsingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

class T2 implements DocumentListener {
    public void changedUpdate(DocumentEvent e) {}
    public void insertUpdate(DocumentEvent e) {
     if((t1.getText()!=null)     
     &&(t2.getText()!=null)
     &&(t3.getText()!=null)
     &&(!t1.getText().equals(""))
     &&(!t2.getText().equals(""))
     &&(!t3.getText().equals(""))){
     b1.setEnabled(true);
     }
    }
    public void removeUpdate(DocumentEvent e) {
     if((t1.getText()!=null)     
     &&(t2.getText()!=null)
     &&(t3.getText()!=null)
     &&(!t1.getText().equals(""))
     &&(!t2.getText().equals(""))
     &&(!t3.getText().equals(""))){
     b1.setEnabled(true);
     }
    }
  }

class B1 implements ActionListener {
public void actionPerformed(ActionEvent e) {
String id = t1.getText();
String longitude = t2.getText();
String latitude = t3.getText();
if (b1.getText().equals("添加")){

try {
(new CreateMapXml()).doInsertElement(id, longitude, latitude);
b1.setEnabled(false);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
  
}
if(b1.getText().equals("修改")){
try {
(new CreateMapXml()).changeElement(id, longitude, latitude);
b1.setEnabled(false);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}

class B2 implements ActionListener {
public void actionPerformed(ActionEvent e) {
String id = t1.getText();
try {
(new CreateMapXml()).deleteElement(id);
b2.setEnabled(false);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
t1.setText("");
t2.setText("");
t3.setText("");
}
}

public static void main(String[] args) {
run(new InputGui(), 375, 200);
}

}

class UpperCaseDocument extends PlainDocument {
private boolean upperCase = true;

public void setUpperCase(boolean flag) {
upperCase = flag;
}

public void insertString(int offset, String str, AttributeSet attSet)
throws BadLocationException {
if (upperCase)
//str = str.toUpperCase();
super.insertString(offset, str, attSet);
}
} // /:~

//CreateMapXml.java
package mapData;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Elements;
import nu.xom.ParsingException;
import nu.xom.Serializer;
import nu.xom.ValidityException;

public class CreateMapXml {
private MapBean mapMessage = new MapBean();

private static String xmlRoot = "map";    //xml文件的root节点
private String xmlMapData="mapdata";   //对应mapdata标签
static Element root = new Element(xmlRoot);

public CreateMapXml(){}
public CreateMapXml(MapBean mapMessage){
//含有MapBean的构造函数
this.mapMessage = mapMessage;
}

public void addToRoot(Element e){
//将子标签添加到root标签下
root.appendChild(e);
}

public static void format(OutputStream os, Document doc) throws Exception {
//格式化xml文件书写格式,如缩进等
Serializer serializer = new Serializer(os, "UTF-8");
serializer.setIndent(4);
//设置不同级别标签间的缩进长度
serializer.setMaxLength(100);
//设置每行默认最大长度
serializer.write(doc);
//将文档写入输出流
serializer.flush();
}

public Element insertElement(MapBean mapMessage){
//向骨架中插入positionID,longitude,latitude标签及元素
Element mapdata = new Element(xmlMapData);
//声明三个标签的父标签

Element positionIDEle = new Element(MapBean.POSITIONID);
positionIDEle.appendChild(mapMessage.getPositionID());
//声明positionID标签并添加内容
Element longitudeEle = new Element(MapBean.LONGITUDE);
longitudeEle.appendChild(mapMessage.getLongitude());
//声明longitude标签并添加内容
Element latitudeEle = new Element(MapBean.LATITUDE);
latitudeEle.appendChild(mapMessage.getLatitude());
//声明latitude标签并添加内容

mapdata.appendChild(positionIDEle);
mapdata.appendChild(longitudeEle);
mapdata.appendChild(latitudeEle);
//将三个标签与其父标签关联
return mapdata;
}


public Element insertElement(String positionID, String longitude, String latitude){
MapBean mapMessage = new MapBean( positionID, longitude, latitude);
//调用insertElement(MapBean)
Element mapdata = insertElement(mapMessage);
return mapdata;
}

public void doInsertElement(String positionID, String longitude, String latitude) throws Exception{
//封装insertElement(),提高内聚性

Element e = this.insertElement(positionID, longitude, latitude);
//将xml结构的MapBean实例写入Element,形成一个元素树块,相当于一个子块
Builder builder = new Builder();
    Document doc = builder.build("mapdata.xml");
    //通过Builder获取xml文件的Document实例
    Element root = doc.getRootElement();
    //获得该xml文件的根节点
    root.insertChild(e, 1);
    //在根节点处插入Element实例

    CreateMapXml.format(System.out, doc);
    //格式化并在控制台输出
    CreateMapXml.format(new BufferedOutputStream(new FileOutputStream("mapdata.xml")), doc);
    //格式化到输出流里写入文件
}
public void doInsertElement(MapBean mapMessage) throws Exception{
//封装insertElement(),提高内聚性
this.doInsertElement(mapMessage.getPositionID(), mapMessage.getLongitude(), mapMessage.getLatitude());
}

public void changeElement(String positionID, String longitude, String latitude) throws Exception{
//将符合positionID的相关信息更改longitude和latitude
Builder builder = new Builder();
    Document doc = builder.build("mapdata.xml");
    //通过Builder从文件中获取xml文件的Document实例
    Element root = doc.getRootElement();
    //获得该xml文件的根节点
Elements mapdatas = root.getChildElements();
//获取子节点集
for(int i=0; i<mapdatas.size(); i++){
Element e = mapdatas.get(i);
//获取子节点集对应序列的节点对象
Element eleTemp = e.getFirstChildElement("positionID");
//System.out.println(e.getLocalName());
//System.out.println(ele.getValue());
if(eleTemp.getValue().equals(positionID)){
//这个方法太笨了,有待改进...
eleTemp = e.getFirstChildElement("longitude");
eleTemp.removeChild(0);
eleTemp.appendChild(longitude);
//将原有经度数据去除并添加新数据
eleTemp = e.getFirstChildElement("latitude");
eleTemp.removeChild(0);
eleTemp.appendChild(latitude);
//将原有纬度数据去除并添加新数据
}

//System.out.println(ele.getValue());
}
CreateMapXml.format(System.out, doc);
    //格式化并在控制台输出
    CreateMapXml.format(new BufferedOutputStream(new FileOutputStream("mapdata.xml")), doc);
    //格式化到输出流里并写入文件
}
public void deleteElement(String positionID) throws Exception{
//将符合positionID的相关信息删除信息
Builder builder = new Builder();
    Document doc = builder.build("mapdata.xml");
    //通过Builder从文件中获取xml文件的Document实例
    Element root = doc.getRootElement();
    //获得该xml文件的根节点
Elements mapdatas = root.getChildElements();
//获取子节点集
for(int i=0; i<mapdatas.size(); i++){
Element e = mapdatas.get(i);
//获取子节点集对应序列的节点对象
Element eleTemp = e.getFirstChildElement("positionID");
//System.out.println(e.getLocalName());
//System.out.println(ele.getValue());
if(eleTemp.getValue().equals(positionID)){
e.removeChildren();
root.removeChild(e);
break;
}
}
CreateMapXml.format(System.out, doc);
    //格式化并在控制台输出
    CreateMapXml.format(new BufferedOutputStream(new FileOutputStream("mapdata.xml")), doc);
    //格式化到输出流里并写入文件
}
public MapBean searchElement(String positionID) throws ValidityException, ParsingException, IOException{
//查询符合positionID的相关信息

MapBean mapMessage = new MapBean();

Builder builder = new Builder();
    Document doc = builder.build("mapdata.xml");
    //通过Builder从文件中获取xml文件的Document实例
    Element root = doc.getRootElement();
    //获得该xml文件的根节点
Elements mapdatas = root.getChildElements();
//获取子节点集

for(int i=0; i<mapdatas.size(); i++){
Element e = mapdatas.get(i);
//获取子节点集对应序列的节点对象
Element eleTemp = e.getFirstChildElement("positionID");
//System.out.println(e.getLocalName());
//System.out.println(ele.getValue());
if(eleTemp.getValue().equals(positionID)){
mapMessage.setPositionID(eleTemp.getValue());
eleTemp = e.getFirstChildElement("longitude");
mapMessage.setLongitude(eleTemp.getValue());
eleTemp = e.getFirstChildElement("latitude");
mapMessage.setLatitude(eleTemp.getValue());
break;
}
}
//将返回结果存入MapBean对象内
return mapMessage;

}

}

//: net/mindview/util/SwingConsole.java
// Tool for running Swing demos from the
// console, both applets and JFrames.
package gui;
import javax.swing.*;

public class SwingConsole {
  public static void
  run(final JFrame f, final int width, final int height) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        f.setTitle(f.getClass().getSimpleName());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(width, height);
        f.setVisible(true);
      }
    });
  }
} ///:~
o了,刚开始写技术性文章,有些乱,见谅...
原创粉丝点击