1. 서문
DOM4J는 매우 우수한 Java 오픈 소스 API로, XML 문서를 읽고 쓰는 데 주로 탁월한 성능, 강력한 기능 및 매우 편리한 사용으로 사용됩니다. 또한 XML은 종종 웹 서비스가 전달한 매개 변수를 호출하고 데이터 동기화 작업을 수행하는 것과 같은 데이터 교환 캐리어에 종종 사용되므로 DOM4J를 사용하여 XML을 구문 분석해야합니다.
2. 준비 조건
dom4j.jar
다운로드 주소 : http://sourceforge.net/projects/dom4j/
3. DOM4J를 사용하여 연습하십시오
1. XML 문서를 구문 분석합니다
구현 아이디어 :
<1> XML 경로를 읽은 후 SaxReader로 전달되어 문서 문서 개체를 반환합니다.
<2> 그런 다음이 문서 개체를 작동하여 다음 노드와 어린이의 정보를 얻습니다.
특정 코드는 다음과 같습니다.
import java.io.file; JavaiofileInputStream 가져 오기; JavaioInputStream 가져 오기; Javautiliterator 수입; Javautillist 수입; orgdom4jdocument 가져 오기; orgdom4jdocumentHelper 가져 오기; orgdom4jelement 가져 오기; orgdom4jiosaxReader 가져 오기; /** * dom4j를 사용하여 XML 문서 * @Author Administrator */public class dom4jparsexmldemo {public void parsexml01 () {try {// src 아래 XML을 입력으로 입력으로 변환합니다. inputStream inputStream = new FileInputStream (new). 파일 ( "d :/project/dynamicweb/src/resource/modulexml")); // inputStream inputStream = thisgetClass () getResourCeasStream ( "/modulexml"); // 클래스의 컴파일 된 파일의 상대 경로를 기반으로 XML을 찾을 수도 있습니다. // XML SaxReader SaxReader = new SaxReader ()를 읽는 데 사용되는 SaxReader Reader를 작성하십시오. // SaxReader의 읽기 다시 작성 방법에 따라 입력 스트림 입력 스트림 또는 파일 개체를 통해 읽을 수 있습니다. Document Document = SaxReadErread (새 파일 ( "D :/Project/DynamicWeb/Src/Resource/ModuleXml"); // 파일의 절대 경로는 // 지정되어 있어야합니다. 또한 documentHelper가 제공 한 XML 변환기도 사용할 수 있습니다. // document document = documentHelPerparSetext ( "<? XML 버전 =/"0/"0/"encoding =/"utf-8/"?> <modules id =/"123/"> <모듈> 모듈 태그의 텍스트 정보 </module> </modules> "); // 루트 노드 객체 요소를 가져옵니다. rootElement = DocumentGetRootElement (); SystemOutPrintln ( "루트 노드 이름 :" + rootElementGetName ()); // 노드 이름을 가져옵니다 SystemOutPrintln ( "루트 노드는 몇 개의 속성 수가 있습니다. 노드 속성 ID SystemEmoutPrintln ( "루트 노드의 텍스트 :" + rootElementGetText ())의 값. // 요소에 어린이가있는 경우 빈 문자열을 반환합니다. 그렇지 않으면 노드의 텍스트가 반환됩니다. SystemOutPrintln ( "Text (1) :" + rootElementGetTextTrim ()); // 제거되는 것은 컨텐츠 Node Child Node의 " + rootElementGetGetStringValue ()) 전후에 공간이 아닌 태그와 태그 사이의 탭 키와 라인 브레이크입니다. // 모든 자식 노드의 텍스트 정보를 현재 노드에서 재귀 적으로 반환합니다. // 자식 노드 가져 오기 요소 요소 = rootElementElement ( "module"); if (element! = null) {SystemEputPrintln ( "하위 노드 텍스트 :" + ElementGetText ()); // 하위 노드와 루트 노드는 요소 객체이기 때문에 작업 방법이 동일하기 때문에 XML이 더 복잡하고 사양이 보이지 않습니다. 특정 노드에 대한 직접 javalangnullpointerexception은 없으므로 요소 객체를 얻은 후 먼저 빈 루트 elementesetname ( "root")인지 결정해야합니다. rooteLementesTettxt ( "텍스트"); // 태그 SystemOutPrintln에서 텍스트를 수정하는 것도 마찬가지입니다 ( "루트 노드가 수정 된 후 텍스트 :" + rootElementGetText ()); } catch (예외 e) {eprintstacktrace (); }} public static void main (String [] args) {dom4jparsexmldemo demo = new dom4jparsexmldemo (); Demoparsexml01 (); }}또한, 위의 XML은 SRC에 있으며, Module01.xml은 다음과 같습니다.
<? xml version = "0"encoding = "utf-8"?> <modules id = "123"> <module> 모듈 태그의 텍스트 정보 </module> </modules>입니다.
다음 으로이 클래스의 주요 방법을 실행하면 콘솔 효과는 다음과 같습니다.
이것으로부터 우리는 다음을 알고 있습니다.
<1> XML 파일을 읽는 방법에는 여러 가지가 있습니다.
<2> 요소 개체의 텍스트와 레이블 이름을 꺼내는 것은 매우 간단합니다.
<3> 요소의 텍스트 및 레이블 이름을 수정하는 것이 매우 편리하지만 디스크 XML 파일에 기록되지 않습니다.
위의는 단순히 XML의 루트 디렉토리의 요소를 얻은 다음 반복자 반복기를 사용하여 문서 문서 개체를 루프합니다.
특정 코드는 다음과 같습니다.
public void parcexml02 () {try {// src 아래의 XML을 입력 스트림 inputStream inputStream으로 변환 = thisgetClass () getResourCeasStream ( "/modulexml"); // XML SaxReader SaxReader를 읽기 위해 특별히 SaxReader Reader를 작성하십시오 = New SaxReader (); // SaxReader의 읽기 다시 작성 방법에 따라 입력 입력 스트림을 통해 읽을 수 있거나 파일 객체 문서를 통해 읽을 수 있음을 알 수 있습니다. 요소 rootElement = DocumentGetRootElement (); Ierator <ELTECT> MODULESITERATOR = ROOTELEMENTELEMENTS ( "MODULE") iterator (); // rootElementElement ( "이름"); 특정 자식 요소 가져 오기 // rootElementElements ( "name"); root 노드 아래에 자식 요소 Moudule 노드 세트를 가져 와서 목록 수집 유형을 반환 // rootElementElements ( "module") iterator (); 반환 된 목록 컬렉션의 각 요소를 반복하고 모든 자식 노드를 반복자 컬렉션으로 반환하는 동안 (moduleTeratorHasNext ()) {element moduleElement = modulesiteratorNext (); 요소 명칭 = moduleElementElement ( "name"); SystemOutPrintln (nameelementGetName () + ":" + nameelementGetText ()); 요소 valueElement = moduleElementElement ( "value"); SystemOutPrintln (valueElementGetName () + ":" + ValueElementGetText ()); 요소 descriptionElement = moduleElementElement ( "설명"); SystemOutPrintln (DescriptElementGetName () + ":" + strectElementGetText ()); }} catch (예외 e) {eprintstacktrace (); }} 또한, 위의 XML은 SRC에 있으며, Module02.xml은 다음과 같습니다.
<? xml version = "1.0"encoding = "utf-8"?> <modules id = "123"> <module> <name> oa </name> <value> 기본 시스템 구성 </value> 기본 시스템 구성 루트 디렉토리 </descript> </modules> </modles>
다음 으로이 클래스의 주요 방법을 실행하면 콘솔 효과는 다음과 같습니다.
이것으로부터 우리는 다음을 알고 있습니다.
<1> dom4j는 XML 하위 요소에 대해 매우 효율적이고 편리합니다.
그러나 위의 내용은 XML의 하위 노드 요소를 단순히 반복하지만 다음에 테스트 할 모듈 03.xml과 같이 XML 규칙이 더 복잡한 경우 세부 사항은 다음과 같습니다.
<? xml version = "1.0"alcoding = "utf-8"?> <modules id = "123"> <module> 이것은 모듈 태그의 텍스트 정보입니다. </module> <module id = ""> <name> oa </name> <value> 기본 시스템 구성 </value> <descript> 기본 구성 </descriguration> 텍스트 정보입니다. 태그 </module> </module> <module> <name> 관리 구성 </name> <value> none> none> </value> <descript> 구성 관리에 대한 지침 </descript> <106 "> <name> 시스템 관리 </name> <value> 0 </value> <descript> config </descript> <name </same id ="107 "> <value> 20394 </value> <descript> 번호 </descript> </module> </module> </module> </modules>
구조가 다르기 때문에 직접 반복하면 오류 가보고됩니다.
java.lang.nullpointerexception
따라서 지금은 신중하게 사용해야합니다. 요소를 매번 반복하는 데 직접 반복 할 수는 없습니다. 특정 구현 코드는 다음과 같습니다.
public void parcexml03 () {try {// src 아래의 XML을 입력 스트림 inputStream inputStream으로 변환 = thisgetClass () getResourCeasStream ( "/modulexml"); // XML SaxReader SaxReader를 읽기 위해 특별히 SaxReader Reader를 작성하십시오 = New SaxReader (); // SaxReader의 읽기 다시 작성 방법에 따라 입력 입력 스트림을 통해 읽을 수 있거나 파일 객체 문서를 통해 읽을 수 있음을 알 수 있습니다. 요소 rootElement = DocumentGetRootElement (); if (rootElementElements ( "module")! = null) {// 첫 번째 모듈 태그에는 내용이 있고 하위 노드가 없기 때문에 iterator ()는 javalangnullpointerexception이므로 목록 <ementt> elementList = rootElementElements ( "module")를 구현해야합니다. for (요소 요소 : elementList) {if (! elementGetTextTrim () equals ( "")) {SystemOutPrintln ( "【1】" + elementGetTextTrim ()); } else {element nameelement = elementElement ( "name"); SystemOutPrintln ( "【2】" + nameelementGetName () + ":" + nameelementGetText ()); 요소 valueElement = ElementElement ( "value"); SystemOutPrintln ( "【2】" + ValueElementGetName () + ":" + ValueElementGetText ()); 요소 descriptionElement = ElementElement ( "설명"); SystemOutPrintln ( "【2】" + descriptionElementGetName () + ":" + descriptionElementGetText ()); List <ELTECT> SUBELENTILLIST = ElementELEMENTS ( "MODULE"); for (element subelement : subelementList) {if (! subElementGetTextRim () equals ( "")) {SystemOutPrintln ( "【3】" + subElementGetTextTrim ()); } else {element subNameElement = subelementElement ( "name"); SystemOutPrintln ( "【3】" + subNameElementGetName () + ":" + subNameElementGetText ()); 요소 subalueelement = subelementelement ( "value"); SystemOutPrintln ( "【3】" + subValueElementGetName () + ":" + subValueElementGetText ()); 요소 subdescriptElement = subelementelement ( "descript"); SystemOutPrintln ( "【3】" + subDescriptElementGetName () + ":" + subDescriptElementGetText ()); }}}}}} catch (예외 e) {eprintstacktrace (); }}다음 으로이 클래스의 주요 방법을 실행하면 콘솔 효과는 다음과 같습니다.
자, 이제 반복 문서에서 빈 참조 문제를 해결할 수 있습니다.
또한, 루프에서 아동 요소를 꺼내는 작업이 반복적이며 재귀로 개선 될 수 있지만, 가독성은 조금 더 나빠질 수 있기 때문에 코드는 실제로 리팩토링 될 수 있습니다.
때때로 XML로 모든 텍스트 정보를 얻어야하거나 다른 텍스트 정보가 전달되는 XML 형식이 표준화되지 않은 경우, 태그의 이름은 대소 문자에 민감하지 않지만 XML은 대소 문자에 민감하지 않지만 쌍으로 나타나야합니다. 따라서이를 피하기 위해 모든 태그 이름을 변경하여 자본화 할 수 있습니다. 특정 코드는 다음과 같습니다.
public static void main (string [] args) {String str = "<? xml 버전 =/"0/"encoding =/"utf-8/"?> <modules id =/"123/"> <module> 모듈 태그 <name> oa </name> <value> 기본 구성 </value> <기본 구성 요소의 텍스트 정보입니다. 시스템 </descript> </module> </modules> "; SystemUtprintln (strreplaceall ( "<[^<]*>", "_"); Pattern Pattern = PatternCompile ( "<[^<]*>"); 매치기 마칭 자 = PatternMatcher (str); while (matcherfind ()) {str = strreplaceall (matchergroup (0), matchergroup (0) touppercase ()); } SystemOutPrintln (str); }실행 후 렌더링은 다음과 같습니다.
2. XML 문서를 생성합니다
DOM4J는 XML을 구문 분석 할 수 있으며 XML을 확실히 생성하며 사용하기가 더 쉽습니다.
구현 아이디어 :
<1> DocumentHelper는 문서 개체를 작성하는 메소드를 제공합니다.
<2>이 문서 객체를 작동하고 노드 아래에 노드와 텍스트, 이름 및 속성 값을 추가합니다.
<3> 그런 다음 XMLWRIRTER WRITER를 사용하여 캡슐화 된 문서 객체를 디스크에 씁니다.
특정 코드는 다음과 같습니다.
import java.io.filewriter; JavaioioException 가져 오기; Javaiowriter 가져 오기; orgdom4jdocument 가져 오기; orgdom4jdocumentHelper 가져 오기; orgdom4jelement 가져 오기; import orgdom4jioxmlwriter; /** * dom4j를 사용하여 XML 문서를 생성하십시오 * @Author Administrator */public class dom4jbuildxmldemo {public void build01 () {try {// documentHelper 문서 개체 문서를 작성하는 메소드를 제공합니다. documentHelperCreatedOcumument (); // 노드 정보 요소 추가 rootElement = DocumentAdDelement ( "modules"); // 이렇게하면 자식 노드를 계속 추가하거나 컨텐츠 rootElementSettxt를 지정할 수 있습니다 ( "이것은 모듈 태그의 텍스트 정보입니다"); 요소 요소 = rootElementAdDelement ( "모듈"); 요소 명소 = ElementAdDelement ( "이름"); 요소 valueElement = ElementAdDelement ( "value"); 요소 descriptionElement = ElementAdDelement ( "description"); NameElementsEttxt ( "name"); NameElementAdDattribute ( "Language", "Java"); // Node valueElementestTxt ( "value")에 대한 속성 값 값 추가; ValueElementAdDattribute ( "언어", "C#"); DescriptionElementSettxt ( "설명"); DescriptionElementAdDattribute ( "언어", "SQL Server"); SystemOutPrintln (DocumentSXML ()); // 문자열 객체를 문자열로 직접 변환합니다. 출력 작가 filewriter = new FileWriter ( "C : // modulexml"); // dom4j는 xmlwriter xmlwriter xmlwriter = new xmlwriter (filewriter)에 특별히 작성된 객체를 제공합니다. xmlwriterwrite (문서); xmlwriterflush (); xmlwriterclose (); SystemOutPrintln ( "XML 문서가 성공적으로 추가되었습니다!"); } catch (ioexception e) {eprintstacktrace (); }} public static void main (String [] args) {dom4jbuildxmldemo demo = new dom4jbuildxmldemo (); demobuild01 (); }} 코드를 실행하는 효과는 다음과 같습니다.
그런 다음 아래 C 드라이브로 이동하여 창조가 성공했는지 확인하십시오. XML 파일의 컨텐츠는 콘솔의 컨텐츠 출력과 동일하다는 것이 밝혀졌습니다.
또한, 위의 생성 된 XML은 인코딩 형식을 지정하지 않지만 UTF-8은 여전히 표시되어 기본 인코딩 형식임을 나타냅니다. 재 지정하려면 olobod.setxmlencoding ( "gbk")을 추가 할 수 있습니다. 디스크에 글을 쓰기 전에.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.