1. 程式人生 > >Java解析xml檔案之增刪改查

Java解析xml檔案之增刪改查

XML是什麼:
可擴充套件的標記語言

XML能幹什麼:
描述資料、儲存資料、傳輸(交換)資料。

XML文件節點型別:
u     文件(document)

u     元素(element)

u     屬性(attribute)

u     文字(PCDATA--parsed character data)

u     註釋(comment)

u     DOCTYPE :主要驗證文件內容的正確性

u     實體(ENTITIES)

u     CDATA(character data)

XML語法:
1、宣告:<?xmlversion="1.0" encoding="UTF-8"?>

2、根節點:必須有一個根節點

3、標籤:標籤必須有結束且區分大小寫,標籤必須順序巢狀

4、屬性:必須引號引起值

5、空格會被保留,HTML空格最多保留一個

6、命名規則:命名必須見名知意

     a)名字可包含字母、數字以及其他的字元 

     b)名字不能以數字或者標點符號開始

     c)名字不能以字元“xml”(或者XML、Xml)開始

7、名字不能包含空格

8、 不應在 XML 元素名稱中使用 ":" ,這是由於它用於名稱空間(namespaces)的保留字。

9、標籤優先於屬性。

10、XML 名稱空間可提供避免元素命名衝突的方法。

11、CDATA:字元資料,<![CDATA[字元資料]]> ,字元資料不進行轉義

首先,新建一個檔案用於儲存資料:

File file = new File("E:/infos.xml");
        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

新建一個person類:

public class Person {
    String name;
    String gender;
    String phone;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public Person(String name, String gender, String phone) {
        super();
        this.name = name;
        this.gender = gender;
        this.phone = phone;
    }
}

新增節點:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringElementContentWhitespace(false);
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Document document = builder.newDocument();
        List<Person> people = new ArrayList<Person>();
        Person p1 = new Person("Amy","femal","1234567");
        Person p2 = new Person("Jack","male","23132133");
        Person p3 = new Person("Alice","femal","21312432");
        people.add(p1);
        people.add(p2);
        people.add(p3);
        Element peopleElement = document.createElement("people");
        for(int i=0;i<people.size();i++) {
            Element personElement = document.createElement("person");
            Element nameElem = document.createElement("name");
            nameElem.setTextContent(people.get(i).getName());
            Element genderElem = document.createElement("gender");
            genderElem.setTextContent(people.get(i).getGender());
            Element phoneElem = document.createElement("phone");
            phoneElem.setTextContent(people.get(i).getPhone());
            
            personElement.appendChild(nameElem);
            personElement.appendChild(genderElem);
            personElement.appendChild(phoneElem);
            
            peopleElement.appendChild(personElement);
        }
        document.appendChild(peopleElement);
        trans(document,file);

    private static void trans(Document document, File file) {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer;
        try {
            transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");// 增加換行縮排,但此時縮排預設為0
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");// 設定縮排為2
            transformer.setOutputProperty("encoding", "UTF-8");
            StringWriter writer = new StringWriter();
            transformer.transform(new DOMSource(document), new StreamResult(writer));
            transformer.transform(new DOMSource(document), new StreamResult(file));
            writer.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

info.xml結果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<people>
   <person>
      <name>Amy</name>
      <gender>femal</gender>
      <phone>1234567</phone>
   </person>
   <person>
      <name>Jack</name>
      <gender>male</gender>
      <phone>23132133</phone>
   </person>
   <person>
      <name>Alice</name>
      <gender>femal</gender>
      <phone>21312432</phone>
   </person>
</people>

修改節點,以修改Amy的電話號碼為例:

File file = new File("E:/infos.xml");
Person p = new Person("Amy","femal","7654321");
revicePerson(file,p);

private static void revicePerson(File file,Person p) {
        Document document = getDocument();  
        NodeList list = document.getElementsByTagName("person");
        for (int i = 0; i < list.getLength(); i++) {
            Element element = (Element) list.item(i);
            String value = element.getAttribute("name");
            if (p.getName().equals(value)) {
                element.getElementsByTagName("gender").item(0).setTextContent(p.getGender());
                element.getElementsByTagName("phone").item(0).setTextContent(p.getPhone());
            }
        }
        trans(document,file);
    }

查詢資訊,以查詢Jack的資訊為例:

String userName = "Jack";
        Person Jack = findPerson(userName);

private static Person findPerson(String userName) {
        Document document = getDocument();  
        NodeList list = document.getElementsByTagName("person");
        for (int i = 0; i < list.getLength(); i++) {
            Element element = (Element) list.item(i);
            String value = element.getAttribute("name");
            if (userName.equals(value)) {
                Person p = new Person();
                p.setName(userName);
                p.setGender(element.getElementsByTagName("gender").item(0).getTextContent());
                p.setPhone(element.getElementsByTagName("phone").item(0).getTextContent());
                return p;
            }
        }
        return null;
    }

刪除資訊,以刪除Alice為例:

String userName = "Alice";
        deletePerson(file,userName);

private static void deletePerson(File file,String userName) {
        Document document = getDocument();  
        NodeList list = document.getElementsByTagName("person");
        for (int i = 0; i < list.getLength(); i++) {
            Element element = (Element) list.item(i);
            String value = element.getAttribute("name");
            if (userName.equals(value)) {
                element.getParentNode().removeChild(element);
                break;
            }
        }
        trans(document,file);
    }