최근에 나는 효율적인 플랫폼 프레임 워크를 연구 해 왔습니다. 실제로 단순한 프레임 워크를 만들고 싶다는 것을 깨달았습니다. 구성 가능한 홈페이지 디스플레이이지만, 2 주 동안 열심히 일한 후에는 기능이 구현 된 후에 이것이 내가 원하는 것이 아니라는 것을 깨달았습니다. 몇 주가 낭비되지 않았으며, 나는 그것으로부터 많은 것을 배웠습니다.
시스템을 구축 할 때 처음에는 XML을 읽을 필요가 있습니다. 따라서 쿼리를 읽고 쿼리하고 삭제 하고이 코드를 검색 할 때 수정합니다 거의 똑같이, 나는 왜이 모든 작업을 수업에 캡슐화하지 않고 그것을 사용할 때 직접 전화하지 않습니까? ,이 사고 방식으로 온라인에서 계속 확인합니다 (온라인으로 무언가가 있어야한다고 생각하기 때문에 직접 캡슐화하면 머리가 실제로 물이 생길 것입니다).
소스 코드 디스플레이 :
코드 사본은 다음과 같습니다.
패키지 com.gxpt.struts2;
import java.io.file;
import java.io.filewriter;
import java.util.iterator;
Java.util.list 가져 오기;
java.util.map import;
import org.dom4j.attribute;
import org.dom4j.document;
import org.dom4j.documentException;
import org.dom4j.documenthelper;
import org.dom4j.element;
import org.dom4j.io.outputformat;
import org.dom4j.io.saxreader;
import org.dom4j.io.xmlwriter;
공개 수업 testAddDeletexml {
개인 문서 문서;
개인 문자열 filepath; // 파일이있는 실제 물리적 경로
// private writeLog writeLog;
public static void main (String [] args)은 DocumentException {
// String filePath = System.GetProperty ( "user.dir")+"/xmlfiles/localservicesconfig.xml";
문자열 filepath = "f : // java project // University Platform // demo // gxpt // webcontent // limits // manager.txt";
testAdDdEleTeXml 연산자 = New TestAdDdeletexml (Filepath);
연산자.getxmlfile ();
// map map = new Hashmap ();
//map.put("ID ","M1 ");
//map.put("name","module1 ");
//map.put("url ","index1.jsp ");
//operator.addchild("div ","div9 ","module "," ", map);
//operator.updatechild("Style "," ","div ","asdfasdf ", 1);
Operator.deletechildone ( "Style", "", "Div", "Div11");
//operator.deletechild("Div ","div9 ","module ");
// String str = Operator.getChild ( "div", "div8", "module");
//system.out.println(str);
// 요소 root = document.getRootElement (); // 루트 노드 이름을 가져옵니다
}
public testadddeletexml (String filepath) {
this.document = null;
this.filepath = filepath;
// writeLog = new WriteLog ();
}
/**
* XML 파일을 만듭니다
* @param rootname : 루트 노드 이름
*/
public void createxmlfile (String RootName) {
if (! filexist ()) {
this.document = documentHelper.CreatEdocument ();
this.document.addelement (rootname);
savexmlfile (this.document);
}
}
/**
* 기존 XML 문서를 받으십시오
* @반품
*/
공개 문서 getxmlfile () {
if (fileExist ()) {
SaxReader Reader = New SaxReader ();
노력하다 {
this.document = reader.read (새 파일 (FilePath));
} catch (DocumentException e) {
// 문자열 loginfo = stacktracetoString.getexceptionTrace (e);
// writeLog.writeLogToend ( "localservermanager", loginfo);
} 마지막으로{
독자 = null;
}
} 또 다른 {
// 로그 작성
// String loginfo = "XML 파일이 존재하지 않습니다. 오류를 읽으십시오!";
// writeLog.writeLogToend ( "localservermanager", loginfo);
System.exit (0);
}
이것을 반환하십시오. 문서;
}
/**
* 요소 추가
* @param rustrypath : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 추가 할 노드 이름입니다
* @param childValue : 추가 할 노드 값
*/
public void addChild (String fathernode, String rashoattr, String ChildName, String ChildValue, map mapattr) {
Childoperator (Fathernode, Abriseattr, Childname, ChildValue, "Add", Mapattr, 0);
}
/**
* 요소를 수정하십시오
* @param rustrypath : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 수정 될 노드 이름입니다
* @param childValue : 수정 될 노드 값
*/
public void updateChild (String fathernode, String rashoattr, String ChildName, String ChildValue, int updateId) {
childoperator (Fathernode, Abrushattr, Childname, ChildValue, "Update", null, updatid);
}
/**
* 요소 삭제
* @param rustrypath : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 삭제할 노드 이름
*/
public void deletechild (String fathernode, String rashoattr, String Childname) {
보육원 (Fathernode, Fatherattr, Childname, "", "Delete", Null, 0);
}
/**
* 요소 삭제
* @param rustrypath : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 삭제할 노드 이름
*/
public void deletechildall (String fathernode, String rashoattr, String Childname) {
아동가 (Fathernode, Fatherattr, Childname, "", "Deleteall", Null, 0);
}
/**
* 요소를 삭제하십시오
* @param rustrypath : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 삭제할 노드 이름
*/
public void deletechildone (String fathernode, String rashoattr, String ChildName, String ChildValue) {
아동 가구 (Fathernode, Fathernode, Abroshattr, Childname, ChildValue, "Deleteone", NULL, 0);
}
/**
* 요소의 값을 얻으십시오
* @param rustrypath : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 삭제할 노드 이름
*/
public String getchild (String fathernode, String rashoattr, String Childname) {
문자열 결과 = "";
결과 = childoperator (Fathernode, rashoattr, Childname, "", "get", null, 0);
반환 결과;
}
/**
* 하위 노드 작동
* @param fathernode : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 수정 될 노드
* @param childValue : 수정 된 노드 값
* @param 운영자 : 수행 할 작업 이름
*/
개인 동기화 문자열 childoperator (String fathernode, String rashoattr, String ChildName, String ChildValue, String Operator, Map MapAttr, int updateid) {
문자열 결과 = "";
if (this.document == null) {
"null"을 반환합니다.
}
요소 root = this.document.getRootElement (); // 루트 노드 이름을 가져옵니다
if (! root.getName (). equals (fathernode)) {// 루트 노드 아래에 추가되지 않으면
결과 = xmlelementoperator (루트, Fathernode, Afrishattr, Childname, ChildValue, Operator, Mapattr);
}또 다른{
if (operator.equals ( "add")) {
요소 childement = root.addelement (childname); // 요소 속성 값은 루트 노드에 존재하지 않습니다.
childelement.setattributevalue ( "id", childvalue);
savexmlfile (this.document);
} else if (Operator.equals ( "Update")) {
children = root.elements (childname);
// for (iterator children = childlements.iterator (); childs.hasnext ();) {
// ELITERY EVERONE = (요소) childs.next ();
// Everyone.settext (childValue); // 요소 값을 수정합니다
// Everyone.setAttributeValue ( "id", childValue);
ELONEYANE = (요소) childElements.get (updateId);
모든 사람 .setattributeValue ( "id", childValue);
//}
savexmlfile (this.document);
} else if (Operator.equals ( "delete")) {
children = root.elements (childname); // 현재 노드에서 모든 자식 노드를 가져 와서 값을 판단하고 수정하십시오.
for (iterator children = childlements.iterator (); childs.hasnext ();) {
ELONEYAL EVERONE = (요소) childs.next ();
childrenes1 = Everyone.elements ( "module");
for (iterator children1 = childlements1.iterator (); childs1.hasnext ();) {
elemery Everyone1 = (요소) childs1.next ();
모두.
}
}
savexmlfile (this.document);
} else if (Operator.equals ( "get")) {
children = root.elements (childname); // 현재 노드에서 모든 자식 노드를 가져 와서 값을 판단하고 수정하십시오.
for (iterator children = childlements.iterator (); childs.hasnext ();) {
ELONEYAL EVERONE = (요소) childs.next ();
result = Everyone.getText ();
}
savexmlfile (this.document);
} else if (Operator.equals ( "deleteOne")) {
children = root.elements (childname); // 현재 노드에서 모든 자식 노드를 가져 와서 값을 판단하고 수정하십시오.
for (iterator children = childlements.iterator (); childs.hasnext ();) {
ELONEYAL EVERONE = (요소) childs.next ();
문자열 divelement = Everyone.attributeValue ( "id");
if (divelement.equals (childValue)) {
root.remove (모두);
}
}
savexmlfile (this.document);
} else if (Operator.equals ( "deleteall")) {
children = root.elements (); // 현재 노드에서 모든 자식 노드를 가져오고 값을 판단하고 수정하십시오.
for (iterator children = childlements.iterator (); childs.hasnext ();) {
ELONEYAL EVERONE = (요소) childs.next ();
list childdiv = Everyone.Elements ();
for (iterator childrendiv = childdiv.iterator (); childsdiv.hasnext ();) {
요소 EveryOnediv = (요소) childsdiv.next ();
모두.
}
}
}
savexmlfile (this.document);
}
반환 결과;
}
/**
* 재귀 요소 작동
* @param 요소 : 재귀 적 요소
* @param fathernode : 부모 노드 이름
* @param rashoattr : 부모 노드 속성
* @param childname : 작동 할 노드
* @param childValue : 작동 후 노드 값
* @param 운영자 : 수행 할 작업 이름
*/
개인 동기화 문자열 xmlelementoPerator (요소 요소, 문자열 fathernode, 문자열 rashoattr, 문자열 childname, 문자열 childvalue, 문자열 연산자, map mapattr) {
문자열 결과 = "";
List Elements = emeter.elements ();
for (iterator it = elements.iterator (); hasnext ();) {
요소 currentElement = (요소) it.next ();
if (! currentElement.getName (). Equals (fathernode)) {// 현재 요소가 우리가 찾고있는 부모 요소가 아닌 경우 계속 검색합니다.
XMLELEMENTOPERATOR (CurrentElement, Fathernode, Afrishattr, ChildName, ChildValue, Operator, Mapattr); // Recursive Call
}또 다른{
if (currentElement.attributeCount ()> 0) {// 현재 요소에 속성 값이 있으면
for (iterator list = currentelement.attributeiterator (); list.hasnext ();) {// 속성 값을 전송합니다
attribute attr = (attribute) list.next ();
if (att
if (Operator.equals ( "add")) {// 요소를 추가합니다
요소 childement = currentElement.addelement (childname);
childlement.settext (childvalue);
iterator itmapattr = mapattr.keyset (). iterator ();
while (itmapattr.hasnext ()) {
문자열 key = (string) itmapattr.next ();
문자열 값 = mapattr.get (key) .toString ();
childelement.setattributevalue (키, 값);
}
// childlement.setattributeValue ( "id", "m1");
// childlement.setattributeValue ( "name", "module1");
// childElement.setAttributeValue ( "url", "index1.jsp");
} else if (Operator.equals ( "Update")) {// 요소를 수정합니다
children = currentElement.elements (childname); // 현재 노드에서 모든 자식 노드를 가져 와서 값을 판단하고 수정하십시오.
for (iterator children = childlements.iterator (); childs.hasnext ();) {
ELONEYAL EVERONE = (요소) childs.next ();
모든 사람 .settext (childvalue); //이 요소의 값을 수정합니다
}
} else if (Operator.equals ( "delete")) {// 지정된 요소를 삭제합니다
children = currentElement.elements (); // 현재 노드에서 모든 자식 노드를 가져오고 값을 판단하고 수정하십시오.
for (iterator children = childlements.iterator (); childs.hasnext ();) {
ELONEYAL EVERONE = (요소) childs.next ();
CurrentElement.remove (모두);
}
} else if (Operator.equals ( "get")) {
children = currentElement.elements (childname); // 현재 노드에서 모든 자식 노드를 가져 와서 값을 판단하고 수정하십시오.
for (iterator children = childlements.iterator (); childs.hasnext ();) {
ELONEYAL EVERONE = (요소) childs.next ();
// result = Everyone.getText ();
result = Everyone.attributeValue ( "id")+","+result;
}
}
또 다른{
// 로그 작성
// 문자열 loginfo = "xmlfile 연산자가 존재하지 않습니다!";
// writeLog.writeLogToend ( "localservermanager", loginfo);
}
}
}
}
}
}
savexmlfile (this.document);
반환 결과;
}
/**
* XML 파일을 저장합니다
* @Param 문서 : XML 파일 이름
*/
private void savexmlfile (문서 문서) {
노력하다 {
outputformat format = outputformat.createPrettyPrint ();
format.setencoding ( "UTF-8");
xmlwriter writer = new xmlwriter (new filewriter (new file (filepath)), 형식);
Writer.write (문서);
Writer.close ();
} catch (예외 e) {
// 문자열 loginfo = stacktracetoString.getexceptionTrace (e);
// writeLog.writeLogToend ( "localservermanager", loginfo);
}
}
/**
* XML 파일이 존재하는지 확인하십시오.
* @param filename
* @반품
*/
Private Boolean FileExist () {
java.io.file objfile = new java.io.file (this.filepath);
if (objfile.exists ()) {
진실을 반환하십시오.
} 또 다른 {
거짓을 반환합니다.
}
}
}
XML 파일 :
코드 사본은 다음과 같습니다.
<? xml 버전 = "1.0"encoding = "utf-8"?>
<스타일>
<div id = "div8">
<module id = "m1"name = "module1"url = "index1.jsp"/>
<module id = "m2"name = "module2"url = "Index2.jsp"/>
<module id = "m3"name = "module3"url = "index3.jsp"/>
</div>
<div id = "div9">
<module id = "m9"name = "module9"url = "Index3.jsp"/>
<module id = "m10"name = "module10"url = "Index4.jsp"/>
<module id = "m11"name = "module11"url = "Index5.jsp"/>
</div>
</스타일>
분석 : 우리는 재귀 방법을 사용하여 작업이 노드 또는 하위 노드에 대한 것인지 여부를 결정합니다. 의존성 주입을 사용하면 IF 판단의 문제를 저장하지만 더 많은 최적화가 없으면 그 당시에 만 데모를했습니다.
요약 : XML을 읽는 것은 실제로 XML 읽기에 대해 썼습니다. 많은 반복을 작성하려면 코드에 반복적으로 수정 해야하는 코드에 문제가 있으므로 때로는 요구 사항이 중요하지만 구현 방법도 마찬가지로 중요합니다!