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