xml是一种可扩展标记语言.用来传输和存储数据,里面的数据以树形结构存储,可以对里面的数据添加约束,
约束有两种 dtd和schema ,目前使用dtd,xml和html类似,可以添加属性,有标签,标签成对出现,一个xml文件只能有一个根标签
xml中有些关键字不能写,需要通过cdata区转义.
xml的声明
<?xml version="1.0" encoding="utf-8"?>
一个将字符串转成xml文件的实例
public class Test1 {
public static void main(String[] args) {
try {
String str = "<student id='num2'><sts_name>李四</sts_name><sts_sex>男</sts_sex><sts_age>19</sts_age><sts_scl>youv</sts_scl></student>";
//将String 类型的数据通过Document转换为树形结构
Document doc = DocumentHelper.parseText(str);
//写入过程
writer(doc);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 把document对象写入新的文件
*
* @param document
* @throws Exception
*/
public static void writer(Document document) throws Exception {
// 紧凑的格式
//OutputFormat format = OutputFormat.createCompactFormat();
// 排版缩进的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码
format.setEncoding("UTF-8");
// 创建XMLWriter对象,指定了写出文件及编码格式
// XMLWriter writer = new XMLWriter(new FileWriter(new
// File("src//a.xml")),format);
//这里可以选择使用字节流还是字符流
XMLWriter writer = new XMLWriter(new OutputStreamWriter(
new FileOutputStream(new File(
"students2.xml")), "UTF-8"), format);
// 写入
writer.write(document);
// 立即写入
writer.flush();
// 关闭操作
writer.close();
}
}
xml的解析.
xml的解析有两种方式dom解析和sax解析
dom解析:将xml文件全部读取,在内存中创建一个树状结构图,然后根据需要获取想要的部分,占用内存空间较大
sax解析:以类似流媒体的形式 去读取文件但并不保存,而是在读取的同时判断,是否是需要的数据,
两者各有优点..使用dom较多
使用dom4j解析xml文件.
使用dom需要导入dom的jar包
采用了解析器工厂获取xml元素,
public class Dom4j_Dom {
@Test
public void dompareXml() throws Exception {
File file = new File("src/com/youv/xml/test/students.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
DOMReader reader = new DOMReader();
Document doc = reader.read(builder.parse(file));
// 获取根节点的元素对象
Element node = doc.getRootElement();
// 遍历所有的元素的节点
listnode(node);
}
/*
* 遍历当前节点元素下面的所有(元素的)子节点 遍历当前节点元素下面所有(元素的)的子接点
*/
@SuppressWarnings("unchecked")
public void listnode(Element node) {
// 获取根节点
System.out.println("根节点的名字" + node.getName());
// 获取节点下的所有属性节点
List<Attribute> list = node.attributes();
// 遍历
for (Attribute attr : list) {
System.out.println(attr.getText() + "---" + attr.getName() + "---" + attr.getValue());
}
// 获取文本数据
if (!(node.getTextTrim().equals(""))) {
System.out.println("获取的文本内容是" + node.getText());
}
// node节点本身的迭代器,获取其内的子节点
Iterator<Element> it = node.elementIterator();
while (it.hasNext()) {
// 获取子节点的对象
Element ent = it.next();
// 递归
listnode(ent);
}
}
}
使用sax解析xml文件,
基本操作一样,不过是获取的sax对象
public class Dom4j_Sax {
@Test
public void saxPareXml() throws Exception{
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File("src/com/youv/xml/test/students.xml"));
//获取根节点元素对象
Element node = document.getRootElement();
//遍历所有的元素节点
listNodes(node);
}
/**
* 遍历当前节点元素下面的所有(元素的)子节点
*
* @param node
*/
@SuppressWarnings("unchecked")
public void listNodes(Element node) {
System.out.println("当前节点---" + node.getName());
// 获取当前节点的所有属性节点
List<Attribute> list = node.attributes();
// 遍历属性节点
for (Attribute attr : list) {
System.out.println(attr.getText() + "---" + attr.getName() + "---" + attr.getValue());
}
if (!(node.getTextTrim().equals(""))) {
System.out.println("文本内容---" + node.getText());
}
// 当前节点下面子节点迭代器
Iterator<Element> it = node.elementIterator();
// 遍历
while (it.hasNext()) {
// 获取某个子节点对象
Element e = it.next();
// 对子节点进行遍历
listNodes(e);
}
}
}