可扩展标记性语言
XML存储不同格式;xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制
XML 被设计用来传输和存储数据,其焦点是数据的内容。
主要用于描述数据
使用SAXReader或SAXBuilder对象 读取一个XML文档(Document)
Element对象表示XML节点
xml存储信息以及书写:
<?xml version=”1.0” encoding=”utf-8”>
<Users>
<!-- 注释 -->
<!-- 写在标签内的叫属性 -->
<user class=”com.gct.XmlStudy.User” id=”user1”>
<!-- 写在标签之间的是标签内信息 -->
<id>1001</id>
<name>zhangsan</name>
<password>wodegecao</password>
<money>200000</money>
</user>
<user class="com.gct.XmlStudy.User" id="user2">
<id>1002</id>
<name>lvbu</name>
<password>wwwwoooo</password>
<money>66666</money>
</user>
<user class="com.gct.XmlStudy.User" id="user3">
<id>1011</id>
<name>diaochan</name>
<password>lubddd</password>
<money>888888</money>
</user>
</Users>
解析XML文件
导入jdom.jar 和dom4j .jar 架包来完成xml文件的解析
//使用dem4j 完成文件的解析
Public class Dom4jXML{
public static void main(String[] args) {
/*
1.获取到解析对象SAXReader
2.将xml文件转换为流 InputStream
3.通过SAXReader从流中读取内容出来转换为(文档Document)
4.获取到根元素节点(元素Element)
5.通过根节点获取到子节点
6.如果有内容就获取,若果有子节点就继续读取
*/
SAXReader sr = new SAXReader();
InputStream in = Dom4jXML.class.getClassLoader().getResourceAsStream("NewFile.xml");
try {
Document doc =sr.read(in);
Element root = doc.getRootElement();
System.out.println("根元素的名称为:"+root.getName());
//展示所有的节点元素
List<Element> list =root.elements();
for (Element el :list ) {
System.out.println("====>子节点名称"+el.getName());
//获取属性值
String attr = el.attributeValue("class");
System.out.println("\tclass的属性值为:"+attr);
//另一种获取子节点的方式
Iterator<Element> it = el.elementIterator();//迭代器
while(it.hasNext()) {
Element e = it.next();
//子节点内容
System.out.println("==>"+ e.getName());
if(e.getName().equals("id")) {
System.out.println("\t\tid 的值为:"+e.getTextTrim());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//使用jdom来解析XMl文件
public class JDomXML {
public static void main(String[] args) {
//获取到解析对象 SAXBuilder
//文件读取转换流
//将流转换为document文档
//获取到根元素
//获取到到所有子元素(子节点)
//读取内容
SAXBuilder sb = new SAXBuilder();
InputStream in = JDomXML.class.getClassLoader().getResourceAsStream("NewFile.xml");
try {
Document doc = sb.build(in);
Element root = doc.getRootElement();
System.out.println("根节点为:"+root.getName());
//当getChildern 中设置获取节点名时,会过滤掉其他不是该节点的节点
List<Element> list = root.getChildren();
for(Element el:list) {
System.out.println("====>子节点值为"+root.getName());
String ass =el.getAttributeValue("class");//获取属性值
System.out.println("\tclass的属性值:"+ass);
List<Element> els = el.getChildren();
for (Element e : els) {
System.out.println("====>子节点值为"+e.getName());
//读取内容
if(e.getName().equals("id")) {
System.out.println("\t子节点的内容为"+e.getTextTrim());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用jdom解析xml文件并将内容添加到User中
public class JdomAddUser{
public static void main(String[] args){
List<User> user = new ArrayList<>();//用来存储读取到的user对象
SAXBuilder sb = new SAXBuilder();//获取到解析对象SAXBuilder
//.getClassLoader() 返回类的类加载器
//.getResourceAsStram(“NewFile.xml”) 返回用于读取指定资源的输入流.Resource(资源)
InputStram in = JdomAddUser.class.getClassLoader().getResourceAsStram(“NewFile.xml”);
try{
//通过SAXBuilder 的build 方法获取到输入流的信息,并以document文档存储
Document doc = sb.build(in);
//获取根
Element root=doc.getRootElement();
//获取根节点,并过滤出节点为user的节点
List<Element> list = root.getChildren(“user”);
for(Element user:list){
//得到节点对应的类,以此可以来进行确认并存储
//拼接得到类名
//String path = "com.gec.xml."+user.getName().substring(0,1).toUpperCase()+user.getName().substring(1);
//通过属性得到类包名,进而可以得到类 (前提是属性中包含包名信息)
String path = user.getAttributeValue("class");
//通过加载的方法得到类
Class clazz = Class.forName(path);
Object obj = clazz.newInstance();//.newInstance创建由此 类对象表示的类的新实例。这个实例用来接收获取到的属性
List<Element> list1 = user.getChildren();//获取user节点下的所有节点(User的属性)
for(Element el:list1){
//节点名是属性名(要看具体的类与xml文件下信息)
Field field = clazz.getDeclaredField(el.getName());
field.setAccessible(true);
if(field.getType().getSimpleName().equals("int"))
field.set(obj, Integer.parseInt(el.getTextTrim()));
else
field.set(obj, el.getTextTrim());
}
user.add((User)obj);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
将修改的内容写入xml文件中
public class JdomInsertXML {
public static void main(String[] args) {
SAXBuilder sb = new SAXBuilder();
InputStream in = JdomInsertXML.class.getClassLoader().getResourceAsStream("NewFile.xml");
try {
Document doc =sb.build(in);
//创建刘的输入对象,添加的节点设置添加格式(format),格式为xml属性格式
XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
//获取到要添加的根节点 我要往哪传
Element root = doc.detachRootElement();
//准备要添加的节点 我要传什么
Element newElement = new Element("user");
//给user节点添加属性 content(内容)
newElement.setAttribute("class","com.gct.XmlStudy.User");
newElement.addContent(new Element("id").setText("1011"));
newElement.addContent(new Element("name").setText("diaochan"));
newElement.addContent(new Element("password").setText("lubddd"));
newElement.addContent(new Element("money").setText("888888"));
//将user节点添加到root节点中 将要传的内容传过去 这里添加到的是取出的root节点下,而非元数据
root.addContent(newElement);
//将根节点重新放入doc中
doc.setRootElement(root);
//将更新后的doc重新输出到User.xml中
out.output(doc, new FileOutputStream("src/NewFile.xml"));
out.clone();
} catch (Exception e) {
e.printStackTrace();
}
}
}