JAVA 는 Dom4j 를 사용 하여 XML 을 해석 합 니 다.

XML 을 분석 하 는 방식 은 매우 많 습 니 다. 본 고 는 dom4j 를 사용 하여 xml 를 분석 하 는 것 을 소개 합 니 다.
1. 환경 준비
(1) dom4j - 1.6.1. jar 다운로드
(2) junit - 4.10. jar 다운로드
2. 따뜻 한 힌트
XML 프로 세 스 를 분석 하 는 것 은 Document 대상 을 가 져 온 다음 에 각 노드 와 속성 등 을 계속 가 져 오 는 것 입 니 다. 따라서 Document 대상 을 가 져 오 는 것 이 첫 번 째 단계 입 니 다. 대체적으로 세 가지 방식 이 있 습 니 다.
(1) 스스로 문서 대상 만 들 기
Document document = DocumentHelper.createDocument();
		Element root = document.addElement("students");

그 중에서 students 는 루트 노드 로 다른 노드 를 계속 추가 할 수 있 습 니 다.
(2) XML 파일 을 읽 고 문서 대상 가 져 오기
//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("XXXX.xml"));
(3) XML 텍스트 내용 읽 기 문서 대상 가 져 오기
String xmlStr = "<students>......</students>";
		Document document = DocumentHelper.parseText(xmlStr);

3. 예시
(1) xml 파일 의 내용 은 다음 과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student1 id="001">
		<微信公众号>@残缺的孤独</微信公众号>
		<学号>20140101</学号>
		<地址>北京海淀区</地址>
		<座右铭>要么强大,要么听话</座右铭>
	</student1>
	<student2 id="002">
		<新浪微博>@残缺的孤独</新浪微博>
		<学号>20140102</学号>
		<地址>北京朝阳区</地址>
		<座右铭>在哭泣中学会坚强</座右铭>
	</student2>
</students>

(2) 해석 과정
package cn.com.yy.dom4j;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class Dom4JforXML {
	
	@Test
	public void test() throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		//遍历
		listNodes(root);
	}
	
	//遍历当前节点下的所有节点
	public void listNodes(Element node){
		System.out.println("当前节点的名称:" + node.getName());
		//首先获取当前节点的所有属性节点
		List<Attribute> list = node.attributes();
		//遍历属性节点
		for(Attribute attribute : list){
			System.out.println("属性"+attribute.getName() +":" + attribute.getValue());
		}
		//如果当前节点内容不为空,则输出
		if(!(node.getTextTrim().equals(""))){
			 System.out.println( node.getName() + ":" + node.getText());  
		}
		//同时迭代当前节点下面的所有子节点
		//使用递归
		Iterator<Element> iterator = node.elementIterator();
		while(iterator.hasNext()){
			Element e = iterator.next();
			listNodes(e);
		}
	}
}

(3) 분석 결과
当前节点的名称:students
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
当前节点的名称:student2
属性id:002
当前节点的名称:新浪微博
新浪微博:@残缺的孤独
当前节点的名称:学号
学号:20140102
当前节点的名称:地址
地址:北京朝阳区
当前节点的名称:座右铭
座右铭:在哭泣中学会坚强

4. dom4j 작업 노드 속성
dom4j 를 사용 하면 노드 속성 을 조작 할 수 있 습 니 다. 예 를 들 어 노드 속성 추가, 노드 속성 삭제, 속성 값 수정 등 작업 입 니 다.다음은 dom4j 를 사용 하여 상기 student 1 노드 에 id 속성 을 삭제 하고 name 속성 을 추가 합 니 다.
(1) 코드 예시
@Test
	public void test2()throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		
		System.out.println("-------添加属性前------");
		//获取节点student1
		Element student1Element = root.element("student1");
		//遍历
		listNodes(student1Element);
		//获取其属性
		Attribute idAttribute = student1Element.attribute("id");
		//删除其属性
		student1Element.remove(idAttribute);
		//为其添加新属性
		student1Element.addAttribute("name", "这是student1节点的新属性");
		System.out.println("-------添加属性后------");
		listNodes(student1Element);
	}

(2) 결과
-------添加属性前------
当前节点的名称:student1
<span style="background-color: rgb(255, 0, 0);">属性id:001</span>
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加属性后------
当前节点的名称:student1
<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">属性name:这是student1节点的新属性
</span></span>当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话

5. dom4j 추가 노드
dom4j 를 사용 하면 지정 한 노드, 노드 추가 등 작업 을 삭제 할 수 있 습 니 다. 저 희 는 dom4j 를 사용 하여 student 1 노드 에 phone 노드 를 추가 할 수 있 습 니 다. 다음 과 같 습 니 다.
(1) 코드
//添加节点
	@Test
	public void test3()throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		System.out.println("-------添加节点前------");
		//获取节点student1
		Element student1Element = root.element("student1");
		//遍历
		listNodes(student1Element);
		//添加phone节点
		Element phoneElement = student1Element.addElement("phone");
		//为phone节点设置值
		phoneElement.setText("137xxxxxxxx");
		System.out.println("-------添加节点后------");
		listNodes(student1Element);
	}

(2) 결과
-------添加节点前------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加节点后------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
当前节点的名称:phone
<span style="color:#ff0000;">phone:137xxxxxxxx</span>

6. Document 대상 을 새 파일 에 기록 합 니 다.
때때로 우 리 는 document 대상 을 새로운 파일 에 기록 해 야 합 니 다. dom4j 는 우리 가 조작 할 수 있 도록 해당 하 는 API 를 제공 합 니 다.우 리 는 5 번 째 를 완성 한 후에 document 을 새로운 파일 s1. xml 에 기록 합 니 다. 다음 과 같 습 니 다.
(1) 코드
//添加节点后,写入新的文件
	@Test
	public void test4()throws Exception{
		//创建SAXReader对象
		SAXReader reader = new SAXReader();
		//读取文件 转换成Document
		Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
		//获取根节点元素对象
		Element root = document.getRootElement();
		System.out.println("-------添加节点前------");
		//获取节点student1
		Element student1Element = root.element("student1");
		//遍历
		listNodes(student1Element);
		//添加phone节点
		Element phoneElement = student1Element.addElement("phone");
		//为phone节点设置值
		phoneElement.setText("137xxxxxxxx");
		System.out.println("-------添加节点后------");
		listNodes(student1Element);
		//把student1Element写入新文件
		writerDocumentToNewFile(document);
		System.out.println("---写入完毕----");
	}
	
	//document写入新的文件
	public void writerDocumentToNewFile(Document document)throws Exception{
		//输出格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		//设置编码
		format.setEncoding("UTF-8");
		//XMLWriter 指定输出文件以及格式
		XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);
		
		//写入新文件
		writer.write(document);
		writer.flush();
		writer.close();
	}

(2) s1. xml 파일 보기
<?xml version="1.0" encoding="UTF-8"?>

<students> 
  <student1 id="001"> 
    <微信公众号>@残缺的孤独</微信公众号>  
    <学号>20140101</学号>  
    <地址>北京海淀区</地址>  
    <座右铭>要么强大,要么听话</座右铭>  
    <phone>137xxxxxxxx</phone>
  </student1>  
  <student2 id="002"> 
    <新浪微博>@残缺的孤独</新浪微博>  
    <学号>20140102</学号>  
    <地址>北京朝阳区</地址>  
    <座右铭>在哭泣中学会坚强</座右铭> 
  </student2> 
</students>

중국어 와 관련 되 어 있 기 때문에 출력 할 때 UTF 8 인 코딩 을 설정 하고, OutputStreamWriter 는 인 코딩 을 설정 해 야 합 니 다.
출력 형식의 문제 도 있 습 니 다. 여기 서 사용 하 는 것 은 Output Format. create Pretty Print () 입 니 다. 문 서 를 출력 할 때 레이아웃 포맷 을 했 습 니 다.또 하 나 는 OutputFormat. create CompactFormat () 방법 으로 출력 내용 은 한 줄 로 포맷 되 지 않 고 컴 팩 트 한 출력 입 니 다.다음 과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students>

마지막 으로 소스 코드 를 동봉 합 니 다.자바 dom4j 분석 xml

좋은 웹페이지 즐겨찾기