最近、私は実際に効率的なプラットフォームフレームワークに取り組んでいます。構成可能なホームページディスプレイですが、おそらく機能が実装された後、2週間一生懸命働いた後、これは私がやりたいことではないことに気付きました。数週間は無駄になりませんでしたが、私はそれから多くを学びました。
システムを構築するとき、私はXMLを読む必要があることがよくありますほぼ同じように、私はなぜこれらすべての操作をクラスにカプセル化して、それらを使用するときに直接電話をかけないのですか? 、このメンタリティがオンラインでチェックされ続けます(自分でカプセル化すると、オンラインで何かがあるに違いないと本当に感じているので、頭は本当に水を得るでしょう)。
ソースコード表示:
コードコピーは次のとおりです。
パッケージcom.gxpt.struts2;
java.io.fileをインポートします。
java.io.filewriterをインポートします。
java.util.iteratorをインポートします。
java.util.listをインポートします。
java.util.mapをインポートします。
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 {
プライベートドキュメントドキュメント。
プライベートストリングフィルパス
// private writelog writelog;
public static void main(string [] args)throws documentexception {
// string filepath = system.getProperty( "user.dir")+"/xmlfiles/localservicesconfig.xml";
String Filepath = "F:// Java Project // University Platform // Demo // Gxpt // webcontent // limits // managle.txt";
testaddeletexml operator = new testAdddeletexml(filepath);
operator.getXmlfile();
//マップマップ= 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 testaddeletexml(string filepath){
this.document = null;
this.filepath = filepath;
// writelog = new writelog();
}
/**
* XMLファイルを作成します
* @param rootname:ルートノード名
*/
public void createxmlfile(string rootname){
if(!fileexist()){
this.document = documenthelper.createdocument();
this.document.addelement(rootname);
savexmlfile(this.document);
}
}
/**
*既存のXMLドキュメントを取得します
* @戻る
*/
公開文書getXmlfile(){
if(fileexist()){
saxreader reader = new Saxreader();
試す {
this.document = reader.read(new file(filepath));
} catch(documentexception e){
// string loginfo = stacktracetostring.getExceptionTrace(e);
// writelog.writelogtoend( "localservermanager"、loginfo);
} ついに{
reader = null;
}
} それ以外 {
//ログを書きます
//文字列loginfo = "xmlファイルは存在しません、読み取りエラー!";
// writelog.writelogtoend( "localservermanager"、loginfo);
System.Exit(0);
}
this.documentを返します。
}
/**
*要素を追加します
* @param fatherpath:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:追加するノード名
* @Param ChildValue:追加するノード値
*/
public void addChild(string fathernode、string fatherattr、string childname、string childvalue、map mapattr){
Childoperator(Fathernode、Fatherattr、Childname、ChildValue、 "add"、mapattr、0);
}
/**
*要素を変更します
* @param fatherpath:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:変更するノード名
* @Param ChildValue:変更するノード値
*/
public void updatechild(string fathernode、string fatherattr、string childname、string childvalue、int updateid){
Childoperator(Fathernode、Fatherattr、Childname、ChildValue、 "Update"、null、updatid);
}
/**
*要素を削除します
* @param fatherpath:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:削除するノードの名前
*/
public void deletechild(string fathernode、string fatherattr、string childname){
Childoperator(Fathernode、Fatherattr、Childname、 ""、 "delete"、null、0);
}
/**
*要素を削除します
* @param fatherpath:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:削除するノードの名前
*/
public void deletechildall(string fathernode、string fatherattr、string childname){
Childoperator(Fathernode、Fatherattr、Childname、 ""、 "deleteall"、null、0);
}
/**
*要素を削除します
* @param fatherpath:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:削除するノードの名前
*/
public void deletechildone(string fathernode、string fatherattr、string childname、string childvalue){
Childoperator(Fathernode、Fatherattr、Childname、ChildValue、 "Deleteone"、null、0);
}
/**
*要素の値を取得します
* @param fatherpath:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:削除するノードの名前
*/
public string getChild(String fathernode、string fatherattr、string childname){
文字列結果= "";
result = Childoperator(fathernode、fatherattr、Childname、 ""、 "get"、null、0);
返品結果;
}
/**
*子ノード操作
* @param fathernode:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:変更するノード
* @Param ChildValue:変更されたノード値
* @paramオペレーター:実行される操作の名前
*/
プライベート同期文字列育児術師(String Fathernode、String Fatherattr、String Childname、String ChildValue、String Operator、Map Mapattr、int updated){
文字列結果= "";
if(this.document == null){
「null」を返します。
}
要素root = this.document.getRootelement(); //ルートノード名を取得します
if(!root.getName()。equals(fathernode)){//ルートノードの下に追加されていない場合
result = xmlelementoperator(root、fathernode、fatherattr、childname、childvalue、operator、mapattr);
}それ以外{
if(operator.equals( "add")){
要素ChildElement = root.Addelement(ChildName); //要素属性値はルートノードに存在しません
ChildElement.setattributevalue( "id"、ChildValue);
savexmlfile(this.document);
} else if(operator.equals( "update")){
children = root.elements(childname)をリスト;
//
//要素全員=(要素)childs.next();
// every.settext(childvalue);
// Everyon.setAttributeValue( "ID"、ChildValue);
要素全員=(要素)ChildElements.get(updateId);
every.setattributevalue( "id"、childvalue);
//}
savexmlfile(this.document);
} else if(operator.equals( "delete")){
子供= root.elements(childname); //すべての子ノードを現在のノードの下に取得し、値を判断し、それらを変更する
for(iterator children = childlements.iterator(); childs.hasnext();){
要素全員=(要素)childs.next();
List Childrens1 = Everyn.Elements( "Module");
for(iterator children1 = childelements1.iterator(); childs1.hasnext();){
Element Everyon1 =(element)Childs1.next();
みんな。
}
}
savexmlfile(this.document);
} else if(operator.equals( "get")){
子供= root.elements(childname); //すべての子ノードを現在のノードの下に取得し、値を判断し、それらを変更する
for(iterator children = childlements.iterator(); childs.hasnext();){
要素全員=(要素)childs.next();
result = every.getText();
}
savexmlfile(this.document);
} else if(operator.equals( "deleteone")){
子供= root.elements(childname); //すべての子ノードを現在のノードの下に取得し、値を判断し、それらを変更する
for(iterator children = childlements.iterator(); childs.hasnext();){
要素全員=(要素)childs.next();
String Divelement = Everyin.attributeValue( "id");
if(divelement.equals(childvalue)){
root.Remove(みんな);
}
}
savexmlfile(this.document);
} else if(operator.equals( "deleteall")){
子供= root.elements(); //すべての子ノードを現在のノードの下に取得し、値を判断し、それらを変更する
for(iterator children = childlements.iterator(); childs.hasnext();){
要素全員=(要素)childs.next();
List ChildDiv = Everyine.Elements();
for(iterator childrendiv = childdiv.iterator(); childsdiv.hasnext();){
要素EveryOnediv =(element)Childsdiv.next();
every.remove(everyonediv);
}
}
}
savexmlfile(this.document);
}
返品結果;
}
/**
*再帰要素操作
* @param要素:再帰的な要素
* @param fathernode:親ノード名
* @param fatherattr:親ノード属性
* @Param ChildName:操作するノード
* @Param ChildValue:操作後のノード値
* @paramオペレーター:実行される操作の名前
*/
プライベート同期文字列XMLELEMENTOPERATOR(要素要素、文字列fathernode、String fatherattr、String ChildName、String ChildValue、String Operator、Map Mapattr){
文字列結果= "";
リスト要素= element.Elements();
for(iterator it = elements.iterator(); it.hasnext();){
要素curnerelement =(element)it.next();
if(!currentelement.getName()。equals(fathernode)){//現在の要素が私たちが探している親要素ではない場合は検索を続けます
XMLELEMENTOPERATOR(CurrentElement、Fathernode、Fatherattr、ChildName、ChildValue、Operator、Mapattr); //再帰コール
}それ以外{
if(currentelement.attributecount()> 0){//現在の要素に属性値がある場合、それは
for(iterator list = culernelement.attributionator(); list.hasnext();){//属性値を送信します
属性属性=(属性)list.next();
if(attr.getValue()。equals(fatherattr)){//属性値に基づいて一意の親要素を決定する
if(operator.equals( "add")){//要素を追加します
Element ChildElement = CurrentElement.Addelement(ChildName);
ChildElement.settext(ChildValue); //子要素の値を設定します
iterator itmapattr = mapattr.keyset()。iterator();
while(itmapattr.hasnext()){
文字列key =(string)itmapattr.next();
string value = mapattr.get(key).toString();
ChildElement.setattributevalue(key、value);
}
// ChildElement.setattributeValue( "id"、 "m1");
// ChildElement.setattributeValue( "name"、 "module1");
// ChildElement.setattributeValue( "url"、 "index1.jsp");
} else if(operator.equals( "update")){//要素を変更します
子供= CurrentElement.Elements(ChildName); //すべての子ノードを現在のノードの下で取得し、値を判断し、それらを変更します
for(iterator children = childlements.iterator(); childs.hasnext();){
要素全員=(要素)childs.next();
every.settext(childvalue); //この要素の値を変更します
}
} else if(operator.equals( "delete")){//指定された要素を削除します
子供= currentelement.elements(); //すべての子ノードを現在のノードの下で取得し、値を判断し、それらを変更する
for(iterator children = childlements.iterator(); childs.hasnext();){
要素全員=(要素)childs.next();
currentelement.remove(みんな);
}
} else if(operator.equals( "get")){
子供= CurrentElement.Elements(ChildName); //すべての子ノードを現在のノードの下で取得し、値を判断し、それらを変更します
for(iterator children = childlements.iterator(); childs.hasnext();){
要素全員=(要素)childs.next();
// result = every.getText();
result = every.attributevalue( "id")+"、"+result;
}
}
それ以外{
//ログを書きます
// string loginfo = "xmlfile演算子は存在しません!";
// writelog.writelogtoend( "localservermanager"、loginfo);
}
}
}
}
}
}
savexmlfile(this.document);
返品結果;
}
/**
* XMLファイルを保存します
* @Paramドキュメント:XMLファイル名
*/
private void savexmlfile(document document){
試す {
outputformat format = outputformat.createprettyprint();
format.setEncoding( "utf-8");
xmlwriter writer = new xmlwriter(new filewriter(new file(filepath))、format);
writer.write(document);
writer.close();
} catch(例外e){
// string 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()){
trueを返します。
} それ以外 {
falseを返します。
}
}
}
XMLファイル:
コードコピーは次のとおりです。
<?xmlバージョン= "1.0" encoding = "utf-8"?>
<style>
<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>
</style>
分析:再帰的な方法を使用して、操作がノードと子ノード用かどうかを判断します。依存関係の注入を使用して、判断の問題を節約しますが、私はその時点でのみデモを行いましたが、最適化を行うことはできません。
要約:XMLを読むことは実際にはXMLを書いていませんが、その時点で使用する必要があるだけでなく、1つだけ書かれています。多くの繰り返しを書くには、繰り返し変更する必要があるコードに問題があります。そのため、要件が重要ですが、それらを実装する方法も同様に重要です!