Kürzlich habe ich an einem effizienten Plattform-Framework gearbeitet. Ein konfigurierbares Homepage -Display, aber nach zwei Wochen, wahrscheinlich nach der Implementierung der Funktion, wurde mir klar, dass dies nicht das ist, was ich tun möchte. Wochen wurden nicht verschwendet, und ich habe viel daraus gelernt.
Beim Erstellen eines Systems habe ich oft die Notwendigkeit, XML zu lesen. Fast gleich, ich fand, warum ich nicht all diese Operationen in eine Klasse in Einklang bringen und sie direkt anrufen, wenn ich sie benutze? Mit dieser Mentalität überprüfen Sie weiterhin online (weil ich wirklich das Gefühl habe, dass es online etwas geben muss, wenn ich es selbst inkapseln, wird mein Kopf wirklich Wasser bekommen).
Quellcodeanzeige:
Die Codekopie lautet wie folgt:
Paket com.gxpt.struts2;
Import Java.io.file;
Import Java.io.FileWriter;
Import Java.util.iterator;
importieren java.util.list;
import 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;
public class testadddeletExml {
privates Dokument Dokument;
private String -Filepath;
// Private WriteLog Writelog;
public static void main (String [] args) löst documentException {aus
// String filepath = system.getProperty ("user.dir")+"/xmlfiles/localServicesConfig.xml";
String filepath = "f: // java project // Universitätsplattform // Demo // gxpt // webcontent // limits // Manager.txt";
testaddDELETExML -Operator = neuer TestaddDELETExML (FilePath);
operator.getXmlFile ();
// map map = new HashMap ();
//map.put("id "," M1 ");
//map.put("name","module1 ");
//map.put("url "," index1.jsp ");
//operator.addchild("div "," div9 "," modul "," ", map);
//operator.updatechild("style ",", "div", "asdfasdf", 1);
Operator.DeletEchildone ("Stil", "," Div "," Div11 ");
//operator.deletEchild("div "," div9 "," modul ");
// String str = operator.getchild ("div", "div8", "modul");
//System.out.println(str);
// Element root = document.getRootelement (); // den Root -Knotennamen abrufen
}
public testadddeletExml (String filepath) {
this.document = null;
this.filepath = filepath;
// writeelog = new WriteLog ();
}
/**
* XML -Datei erstellen
* @param rootName: Root -Knotenname
*/
public void createxmlfile (String RootName) {
if (! FileExist ()) {
this.document = documentHelper.Createdocument ();
this.document.addelement (rootName);
SavexMlFile (this.document);
}
}
/**
* Holen Sie sich ein vorhandenes XML -Dokument
* @zurückkehren
*/
öffentliches Dokument getXmlFile () {
if (FileExist ()) {
SaxReader Reader = neuer Saxreader ();
versuchen {
this.document = reader.read (neue Datei (filepath));
} catch (documentException e) {
// String loginfo = stacktracetoString.getExceptionTrace (e);
// Writeelog.WriteLoGoend ("LocalerverManager", loginfo);
} Endlich{
Reader = null;
}
} anders {
// ein Protokoll schreiben
// String loginfo = "XML -Datei existiert nicht, lesen Sie Fehler!";
// Writeelog.WriteLoGoend ("LocalerverManager", loginfo);
System.exit (0);
}
Rückgabe dieses Dokuments;
}
/**
* Elemente hinzufügen
* @Param VaterPath: Elternknotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @param ChildName: Der zugegebene Knotenname
* @param ChildValue: Der zugegebene Knotenwert
*/
public void addChild (String Fathernode, String fatherAttr, String ChildName, String ChildValue, Map MAPATTR) {
Childoperator (Fathernode, Vaterattr, ChildName, ChildValue, "Add", MAPATTR, 0);
}
/**
* Elemente ändern
* @Param VaterPath: Elternknotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @Param ChildName: Der zu modifizierte Knotenname
* @Param ChildValue: Der zu modifizierende Knotenwert
*/
public void updatechild (String fathernode, String fatherAttr, String ChildName, String ChildValue, int updateid) {
Childoperator (Fathernode, Vaterattr, ChildName, ChildValue, "Update", Null, Updatid);
}
/**
* Elemente löschen
* @Param VaterPath: Elternknotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @Param ChildName: Der Name des zu gelöschten Knotens
*/
public void deletechild (String fathernode, String fatherattr, String ChildName) {
Childoperator (Fathernode, Vaterattr, Kindername, "," Delete ", Null, 0);
}
/**
* Elemente löschen
* @Param VaterPath: Elternknotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @Param ChildName: Der Name des zu gelöschten Knotens
*/
public void deletechildall (String Fathernode, String fatherattr, String ChildName) {
Childoperator (Fathernode, Vaterattr, Kindername, "," Deleteall ", Null, 0);
}
/**
* Ein Element löschen
* @Param VaterPath: Elternknotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @Param ChildName: Der Name des zu gelöschten Knotens
*/
public void DeletEchildone (String Fathernode, String fatherattr, String ChildName, String ChildValue) {
Childoperator (Fathernode, Vaterattr, ChildName, ChildValue, "Deleteone", Null, 0);
}
/**
* Erhalten Sie den Wert eines Elements
* @Param VaterPath: Elternknotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @Param ChildName: Der Name des zu gelöschten Knotens
*/
public String getChild (String Fathernode, String fatherattr, String Childname) {
String result = "";
Ergebnis = Childoperator (Fathernode, Vaterattr, Kindername, "", "get", null, 0);
Rückgabeergebnis;
}
/**
* Kinderknotenoperation
* @param fathernode: übergeordneter Knotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @param ChildName: Der zu modifizierte Knoten
* @Param ChildValue: Modifizierter Knotenwert
* @Param -Operator: Der Name der zu erledigenden Operation
*/
private synchronisierte String Childoperator (String Fathernode, String Vaterattr, String ChildName, String ChildValue, String -Operator, Map MAPATTR, int updateId) {
String result = "";
if (this.document == null) {
zurück "null";
}
Element root = this.document
if (! root.getName (). Equals (Fathernode)) {// Wenn es nicht unter dem Stammknoten hinzugefügt wird
Ergebnis = xmlelementoperator (Wurzel, Fathernode, Vaterattr, Kindername, Kinderwert, Operator, MAPATTTR);
}anders{
if (operator.equals ("add")) {
Element Childelement = root.addelement (ChildName); // Der Element -Attributwert existiert im Stammknoten nicht
childelement.setattributeValue ("id", ChildValue);
SavexMlFile (this.document);
} else if (operator.equals ("update")) {
List childhes = root.elements (ChildName);
// für (Iterator Kinder = Kinder.Iderator (); Childs.hasNext ();) {
// Element jeder = (Element) Childs.Next ();
// jeder.setText (ChildValue);
// jeder.setattributeValue ("id", ChildValue);
Element jeder = (Element) Childelements.get (updateId);
jeder.SetatTributeValue ("id", ChildValue);
//}
SavexMlFile (this.document);
} else if (operator.equals ("delete")) {
Listen Sie Kinder = Root.element
für (Iterator Kinder = Kinder.Iderator (); Childs.hasnext ();) {
Element jeder = (Element) Childs.Next ();
Listen Sie Kinder auf1 = jeder. Elemente ("Modul");
für (Iterator Kinder1 = Childelements1.iterator (); Childs1.hasnext ();) {
Element jeder1 = (Element) Childs1.Next ();
jeder.
}
}
SavexMlFile (this.document);
} else if (operator.equals ("get")) {
Listen Sie Kinder = Root.element
für (Iterator Kinder = Kinder.Iderator (); Childs.hasnext ();) {
Element jeder = (Element) Childs.Next ();
result = jedery.getText ();
}
SavexMlFile (this.document);
} else if (operator.equals ("Deleteone")) {
Listen Sie Kinder = Root.element
für (Iterator Kinder = Kinder.Iderator (); Childs.hasnext ();) {
Element jeder = (Element) Childs.Next ();
String Divelement = jeder.attributeValue ("id");
if (Divelement.equals (ChildValue)) {
root.remove (jeder);
}
}
SavexMlFile (this.document);
} else if (operator.equals ("DeleteAll")) {
Listen Sie Kinder = root.elements (); // Holen Sie sich alle untergeordneten Knoten unter den aktuellen Knoten, beurteilen Sie ihre Werte und ändern Sie sie
für (Iterator Kinder = Kinder.Iderator (); Childs.hasnext ();) {
Element jeder = (Element) Childs.Next ();
Listen kindiv = jeder.elements ();
für (Iterator Childrendiv = Childdiv.iterator (); Childsdiv.hasnext ();) {
Element EveryOnediv = (Element) Childsdiv.Next ();
jeder.
}
}
}
SavexMlFile (this.document);
}
Rückgabeergebnis;
}
/**
* Rekursive Elementoperation
* @Param Element: Das Element, das rekursiv ist
* @param fathernode: übergeordneter Knotenname
* @param fatherAttr: übergeordnetes Knotenattribut
* @Param ChildName: Der Knoten, auf dem man betrieben werden muss
* @param ChildValue: Knotenwert nach dem Betrieb
* @Param -Operator: Der Name der zu erledigenden Operation
*/
private synchronisierte String xmlelementoperator (Elementelement, String Fathernode, String Vaterattr, String Childname, String ChildValue, String -Operator, Map MAPATTR) {
String result = "";
Listelements = element.elements ();
für (iterator it = elements.iterator (); it.hasnext ();) {{
Element CurrentElement = (Element) iT.Next ();
If (! CurrentElement.getName (). Equals (Fathernode)) {// Suchen Sie weiter, wenn das aktuelle Element nicht das übergeordnete Element ist, nach dem wir suchen
Xmlelementoperator (CurrentElement, Fathernode, Paterattr, ChildName, ChildValue, Operator, MAPATTTR); // Rekursiver Anruf
}anders{
if (currentelement.attributeCount ()> 0) {// Wenn das aktuelle Element einen Attributwert hat, ist es
für (iterator list = currentElement.attributIterator (); list.hasnext ();) {// den Attributwert übertragen
Attribut attr = (Attribut) liste.Next ();
if (attr.getValue (). Equals (VaterAttr)) {// Bestimmen Sie das eindeutige übergeordnete Element basierend auf dem Attributwert
if (operator.equals ("add")) {// Element hinzufügen
Element ChildElement = CurrentElement.addelement (ChildName);
ChildElement.setText (ChildValue);
Iterator itmapattr = mapattr.keyset (). Iterator ();
while (itmapattr.hasnext ()) {
String key = (string) itmapattr.next ();
String value = mukattr.get (Schlüssel) .ToString ();
childelement.setattributeValue (Schlüssel, Wert);
}
// Childelement.setattributeValue ("id", "m1");
// Childelement.setattributeValue ("Name", "Modul1");
// Childelement.setattributeValue ("url", "index1.jsp");
} else if (operator.equals ("update")) {// ein Element ändern
Listen Sie Kinder = currentElement.element
für (Iterator Kinder = Kinder.Iderator (); Childs.hasnext ();) {
Element jeder = (Element) Childs.Next ();
Jeder.setText (ChildValue);
}
} else if (operator.equals ("delete")) {// Ein angegebenes Element löschen
Listen Sie Kinder = currentElement auf.
für (Iterator Kinder = Kinder.Iderator (); Childs.hasnext ();) {
Element jeder = (Element) Childs.Next ();
currentElement.remove (alle);
}
} else if (operator.equals ("get")) {
Listen Sie Kinder = currentElement.element
für (Iterator Kinder = Kinder.Iderator (); Childs.hasnext ();) {
Element jeder = (Element) Childs.Next ();
// result = jeder.getText ();
result = jeder.attributeValue ("id")+","+result;
}
}
anders{
// ein Protokoll schreiben
// String loginfo = "Xmlfile -Operator existiert nicht!";
// Writeelog.WriteLoGoend ("LocalerverManager", loginfo);
}
}
}
}
}
}
SavexMlFile (this.document);
Rückgabeergebnis;
}
/**
* Speichern Sie die XML -Datei
* @param Dokument: XML -Dateiname
*/
private void Savexmlfile (Dokumentdokument) {
versuchen {
OutputFormat format = outputFormat.CreatePrettTyprint ();
format.setencoding ("utf-8");
Xmlwriter writer = new XMLWriter (neuer FileWriter (neue Datei (Filepath)), Format);
Writer.Write (Dokument);
writer.close ();
} catch (Ausnahme e) {
// String loginfo = stacktracetoString.getExceptionTrace (e);
// Writeelog.WriteLoGoend ("LocalerverManager", loginfo);
}
}
/**
* Bestimmen Sie, ob die XML -Datei vorhanden ist.
* @param Dateiname
* @zurückkehren
*/
private boolean FileExist () {
java.io.file objfile = new java.io.file (this.filepath);
if (objfile.exists ()) {
zurückkehren;
} anders {
false zurückgeben;
}
}
}
XML -Datei:
Die Codekopie lautet wie folgt:
<? xml Version = "1.0" coding = "utf-8"?>
<Styles>
<div id = "div8">
<modul id = "m1" name = "modul1" url = "index1.jsp"/>
<modul id = "m2" name = "modul2" url = "index2.jsp"/>
<modul id = "m3" name = "modul3" url = "index3.jsp"/>
</div>
<div id = "div9">
<modul id = "m9" name = "modul9" url = "index3.jsp"/>
<modul id = "m10" name = "module10" url = "index4.jsp"/>
<modul id = "m11" name = "modul11" url = "index5.jsp"/>
</div>
</style>
Analyse: Wir verwenden eine rekursive Methode, um festzustellen, ob der Vorgang für den Knoten oder den untergeordneten Knoten ist, was relativ klar ist. Verwenden Sie die Abhängigkeitsinjektion, sparen Sie sich die Mühe, wenn Sie das Urteilsvermögen ohne mehr Optimierungen vorgenommen haben, wenn Sie interessiert sind.
Zusammenfassung: Es ist eigentlich nicht schwierig, XML zu lesen. Um viele Wiederholungen zu schreiben, gibt es ein Problem mit dem Code, der wiederholt geändert werden muss. Manchmal ist es ebenso wichtig, wie die Anforderungen wichtig sind, obwohl die Anforderungen wichtig sind!