XML文档解析的方式4种
1.SAX解析XML文件
2.DOM解析XML文件
3.JDOM解析XML文件
4.DOM4J解析XML文件
注意:XML文件的解析格式有两种:SAX解析和DOM解析(DOM , JDOM , DOM4J )
下面就介绍一下JDOM解析XML文件
步骤:
1.创建一个DOM解析器(文档生成器)工厂对象
2.通过工厂对象创建一个DOM解析器对象
3.解析文档
4.从内存中读取数据生成对象
特点:
1.基于树型结构,
2.通过解析器一次性把文档加载到内存中,所以会比较占用内存,
3.可以随机访问,更加灵活,适合web端开发.
public void SSSXML() throwsIOException, SAXException, ParserConfigurationException {//创建一个DOM解析器(文档生成器)工厂对象
DocumentBuilderFactory documentBuilderFactory =DocumentBuilderFactory.newInstance();//通过工厂对象创建一个DOM解析器对象
DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
InputStream resourceAsStream =Thread.currentThread().getContextClassLoader().getResourceAsStream("com\\xml\\person.xml");//此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储;
Document parse =documentBuilder.parse(resourceAsStream);//4.从内存中读取数据生成对象//获取节点名称为person的所有节点,返回节点集合.
NodeList personNodeList = parse.getElementsByTagName("person");
ArrayList persons = new ArrayList<>();
Person person= null;//循环读取
for (int i = 0; i < personNodeList.getLength(); i++) {
Node personNode=personNodeList.item(i);
person= newPerson();//获取节点属性值;
String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
person.setPersonid(personid);//获取当前节点的所有子节点
NodeList childNodes =personNode.getChildNodes();for (int j = 0; j
Node item=childNodes.item(j);
String nodeName=item.getNodeName();if("name".equals(nodeName)){
person.setName(item.getFirstChild().getNodeValue());
}else if("address".equals(nodeName)){
person.setTel(item.getFirstChild().getNodeValue());
}else if("tel".equals(nodeName)){
person.setTel(item.getFirstChild().getNodeValue());
}else if("fax".equals(nodeName)){
person.setFax(item.getFirstChild().getNodeValue());
}else if("email".equals(nodeName)){
person.setEmail(item.getFirstChild().getNodeValue());
}
}
persons.add(person);
}
System.out.println("结果:");for(Person person1 : persons) {
System.out.println(person1);
}
}
DOM4J解析XML文件
步骤:
1.创建DOM4J解析器
2.解析文档
3.从内存中读取数据生成对象
特点:
1.基于树型结构
2.第三方组件
3.解析速度快,效率更高,使用JAVA中的迭代器进行数据读取,在web框架中使用较多,比如(Hibernate框架)
首先创建一个XML配置文件(解析这个文件需要导入dom4j-1.6.1.jar包,具体版本可能有新旧之分)
2019-07-222019-07-22
下面就用这个XML文件实现增删改查
1.查询
packagecn.kgc.dom4jtest;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importjava.util.Iterator;public classTest {public static voidmain(String[] args) {//创建DOM4J解析器对象
SAXReader saxReader = newSAXReader();try{//读取xml文件,并生成document对象 现可通过document来操作文档
Document document = saxReader.read("src/info.xml");//获取到文档的根节点
Element rootElement =document.getRootElement();
System.out.println("根节点的名字是:" +rootElement.getName());//获取子节点列表
Iterator it =rootElement.elementIterator();while(it.hasNext()) {
Element fistChild=(Element) it.next();//System.out.println(fistChild.getName());//获取节点的属性值
System.out.println(fistChild.attribute("name").getValue());//获取子节点的下一级节点
Iterator iterator =fistChild.elementIterator();while(iterator.hasNext()) {
Element element=(Element) iterator.next();
System.out.println("\t" + element.attributeValue("name"));
}
}
}catch(DocumentException e) {
e.printStackTrace();
}
}
}
2.添加
packagecn.kgc.dom4jtest;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importorg.dom4j.io.XMLWriter;importjava.io.File;importjava.io.FileOutputStream;importjava.io.OutputStream;public classAddTest1 {/*** 添加节点操作
*@paramargs*/
public static voidmain(String[] args) {//创建DOM4J解析器对象
SAXReader saxReader = newSAXReader();try{
Document document= saxReader.read("src/info.xml");//获取到根节点
Element rootElement =document.getRootElement();//添加一个子节点
Element brand = rootElement.addElement("brand");//给当前节点添加属性
brand.addAttribute("name", "魅族");
Element type= brand.addElement("type");
type.addAttribute("name", "s16");
OutputStream os= new FileOutputStream(new File("src/info.xml"));
XMLWriter xmlWriter= newXMLWriter(os);
xmlWriter.write(rootElement);
xmlWriter.flush();
}catch(Exception e) {
e.printStackTrace();
}
}
}
3.修改
packagecn.kgc.dom4jtest;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importorg.dom4j.io.XMLWriter;importjava.io.File;importjava.io.FileOutputStream;importjava.util.Iterator;/*** 节点修改测试*/
public classUpdateTest {public static voidmain(String[] args) {//创建DOM4J解析器对象
SAXReader saxReader = newSAXReader();try{
Document document= saxReader.read("src/info.xml");//获取根节点
Element rootElement =document.getRootElement();
Iterator it=rootElement.elementIterator();while(it.hasNext()) {
Element element=(Element) it.next();
System.out.println(element.attributeValue("name"));if (element.attributeValue("name").equals("魅族")) {
Iterator iterator=element.elementIterator();while(iterator.hasNext()) {
Element type=(Element) iterator.next();if (type.attributeValue("name").equals("s16")) {
type.addAttribute("name", "16 pro");
}
}
}
}
XMLWriter xmlWriter= new XMLWriter(new FileOutputStream(new File("src/info.xml")));
xmlWriter.write(document);
xmlWriter.flush();
}catch(Exception e) {
e.printStackTrace();
}
}
}
4.删除
packagecn.kgc.dom4jtest;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importorg.dom4j.io.XMLWriter;importjava.io.File;importjava.io.FileOutputStream;importjava.util.Iterator;/*** 删除节点测试*/
public classDeleteTest {public static voidmain(String[] args) {
SAXReader saxReader= newSAXReader();try{
Document document= saxReader.read("src/info.xml");
Element rootElement=document.getRootElement();
Iterator iterator=rootElement.elementIterator();while(iterator.hasNext()) {
Element brand=(Element) iterator.next();if ("魅族".equals(brand.attributeValue("name"))) {//通过父节点来删除子节点
brand.getParent().remove(brand);
}
}
XMLWriter xmlwriter= new XMLWriter(new FileOutputStream(new File("src/info.xml")));
xmlwriter.write(document);
xmlwriter.flush();
}catch(Exception e) {
e.printStackTrace();
}
}
}