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);
}