في الآونة الأخيرة ، كنت أعمل على إطار عمل فعال. عرض الصفحة الرئيسية القابلة للتكوين ، ولكن بعد العمل الجاد لمدة أسبوعين ، ربما بعد تنفيذ الوظيفة ، أدركت أن هذا ليس ما أريد القيام به. لم تضيع الأسابيع ، وقد تعلمت الكثير منها.
عند بناء نظام ، أتواجه في كثير من الأحيان قراءة XML. نفس الشيء ، وجدت أنه ، لماذا لا أقوم بتغليف كل هذه العمليات في الفصل وأتصل بها مباشرة عند استخدامها؟ ، مع استمرار هذه العقلية في التحقق عبر الإنترنت (لأنني أشعر حقًا أنه يجب أن يكون هناك شيء عبر الإنترنت ، إذا قمت بتغليفه بنفسي ، فإن رأسي سيحصل حقًا على الماء).
عرض رمز المصدر:
نسخة الكود كما يلي:
حزمة com.gxpt.struts2 ؛
استيراد java.io.file ؛
استيراد java.io.filewriter ؛
استيراد java.util.iterator ؛
استيراد java.util.list ؛
استيراد java.util.map ؛
استيراد org.dom4j.attribute ؛
استيراد org.dom4j.document ؛
استيراد org.dom4j.documentException ؛
استيراد org.dom4j.documentHelper ؛
استيراد org.dom4j.element ؛
استيراد org.dom4j.io.outputformat ؛
استيراد org.dom4j.io.saxreader ؛
استيراد org.dom4j.io.xmlWriter ؛
الطبقة العامة Testaddedletexml {
وثيقة الوثيقة الخاصة ؛
سلسلة خاصة
// private WriteLog WriteLog ؛
الفراغ الثابت العام (سلسلة [] args) يلقي DocumentException {
// string filepath = system.getProperty ("user.dir")+"/xmlfiles/alcalservicesconfig.xml" ؛
String FilePath = "F: // Java Project // University Platform // Demo // gxpt // webcontent // limits // manager.txt" ؛
TESTADDDELETEXML Operator = جديد TESTADDDELEXML (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.DELETECHILD("DIV "،" div9 "،" module ") ؛
// string str = operator.getChild ("div" ، "div8" ، "module") ؛
//system.out.println(STR) ؛
// element root = document.getRootElement () ؛ // احصل على اسم عقدة الجذر
}
public testadddletexml (سلسلة 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 = New SaxReader () ؛
يحاول {
this.document = reader.read (ملف جديد (filePath)) ؛
} catch (documentException e) {
// string loginfo = stacktracetoString.getExceptionTrace (e) ؛
// writelog.writelogtoend ("localservermanager" ، loginfo) ؛
} أخيراً{
القارئ = فارغ ؛
}
} آخر {
// كتابة سجل
// string loginfo = "ملف XML غير موجود ، اقرأ خطأ!" ؛
// writelog.writelogtoend ("localservermanager" ، loginfo) ؛
System.exit (0) ؛
}
إرجاع هذا.
}
/**
* إضافة عناصر
* param الأب: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: اسم العقدة المراد إضافته
* param childvalue: قيمة العقدة المراد إضافتها
*/
public void addChild (سلسلة fathernode ، سلسلة الأب ، childname ، سلسلة childvalue ، خريطة mapattr) {
childoperator (fathernode ، doyrattrt ، ilingname ، childvalue ، "add" ، mapattr ، 0) ؛
}
/**
* تعديل العناصر
* param الأب: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: اسم العقدة المراد تعديله
* param childvalue: قيمة العقدة المراد تعديلها
*/
public void updatechild (String fathernode ، string doyrattr ، childname string ، childvalue ، int updateId) {
childoperator (fathernode ، doyrattr ، idildname ، childvalue ، "update" ، null ، updatid) ؛
}
/**
* حذف العناصر
* param الأب: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: اسم العقدة المراد حذفها
*/
public void deletechild (String fathernode ، string doyrattr ، childname) {
childoperator (fathernode ، doyrattr ، idildname ، "" ، "delete" ، null ، 0) ؛
}
/**
* حذف العناصر
* param الأب: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: اسم العقدة المراد حذفها
*/
public void deletechildall (String fathernode ، string doyrattr ، childname) {
childoperator (fathernode ، doyrattr ، idildname ، "" ، "deleteall" ، null ، 0) ؛
}
/**
* حذف عنصر
* param الأب: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: اسم العقدة المراد حذفها
*/
public void deletechildone (String fathernode ، string doyrattr ، childname string ، childvalue) {
childoperator (fathernode ، doyratttr ، idildname ، childvalue ، "deleteone" ، null ، 0) ؛
}
/**
* احصل على قيمة عنصر
* param الأب: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: اسم العقدة المراد حذفها
*/
السلسلة العامة getChild (سلسلة fathernode ، سلسلة الأب ،
نتيجة السلسلة = "" ؛
النتيجة = childoperator (fathernode ، doyrattr ، idildname ، "" ، "get" ، null ، 0) ؛
نتيجة العودة
}
/**
* عملية عقدة الطفل
* param fathernode: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: العقدة المراد تعديلها
* param childvalue: قيمة العقدة المعدلة
* param عامل: اسم العملية المراد تنفيذها
*/
سلسلة متزامنة خاصة childoperator (سلسلة fathernode ، سلسلة الأب ، childname ، سلسلة childvalue ، مشغل سلسلة ، mapattr ، int updateid) {
نتيجة السلسلة = "" ؛
if (this.document == null) {
إرجاع "NULL" ؛
}
الجذر العنصر = this.document.getRootElement () ؛ // احصل على اسم عقدة الجذر
if (! root.getName (). يساوي (pathernode)) {// إذا لم تتم إضافته تحت عقدة الجذر
النتيجة = xmlelementOperator (الجذر ، fathernode ، dofrondtr ، idildname ، childvalue ، المشغل ، mapattr) ؛
}آخر{
if (corpator.equals ("add")) {
element childelement = root.adDelement (ilfildName) ؛ // لا توجد قيمة سمة العنصر في عقدة الجذر
childelement.setattributeValue ("id" ، childvalue) ؛
SavexMlfile (this.document) ؛
} آخر إذا (المشغل.
قائمة الأطفال = الجذر.
// لـ (iterator children = labillements.iterator () ؛ childs.hasnext () ؛) {
// element one very = (element) childs.next () ؛
// الجميع.
// elope.setattributeValue ("id" ، childvalue) ؛
عنصر الجميع = (عنصر) childlements.get (updateId) ؛
الجميع.
//}
SavexMlfile (this.document) ؛
} آخر إذا (المشغل.
قائمة الأطفال = الجذر.
لـ (ايتراتور الأطفال = اولاد.
عنصر الجميع = (عنصر) childs.next () ؛
قائمة الأطفال 1 = الجميع. Elements ("الوحدة النمطية") ؛
ل (ايتراتور الأطفال 1 = childelements1.iterator () ؛ childs1.hasnext () ؛) {
العنصر الجميع 1 = (العنصر) childs1.next () ؛
الجميع.
}
}
SavexMlfile (this.document) ؛
} آخر إذا (المشغل.
قائمة الأطفال = الجذر.
لـ (ايتراتور الأطفال = اولاد.
عنصر الجميع = (عنصر) childs.next () ؛
النتيجة = eLuer.getText () ؛
}
SavexMlfile (this.document) ؛
} آخر إذا (المشغل.
قائمة الأطفال = الجذر.
لـ (ايتراتور الأطفال = اولاد.
عنصر الجميع = (عنصر) childs.next () ؛
السلسلة divelement = eLuer.AttributeValue ("id") ؛
if (divelement.equals (childvalue)) {
root.remove (الجميع) ؛
}
}
SavexMlfile (this.document) ؛
} آخر إذا (المشغل.
قائمة الأطفال = root.elements () ؛ // احصل على جميع العقد الفرعية تحت العقدة الحالية ، والحكم على قيمهم ، وتعديلها
لـ (ايتراتور الأطفال = اولاد.
عنصر الجميع = (عنصر) childs.next () ؛
قائمة childdiv = elope.elements () ؛
لـ (iterator childrendiv = childdiv.iterator () ؛ childsdiv.hasnext () ؛) {
عنصر everyonediv = (element) childsdiv.next () ؛
الجميع.
}
}
}
SavexMlfile (this.document) ؛
}
نتيجة العودة
}
/**
* عملية العناصر العودية
* @param element: العنصر ليكون متكررًا
* param fathernode: اسم العقدة الأصل
* @param doyrattr: سمة عقدة الوالدين
* param childname: العقدة التي سيتم تشغيلها عليها
* param childvalue: قيمة العقدة بعد العملية
* param عامل: اسم العملية المراد تنفيذها
*/
سلسلة متزامنة خاصة xmlelementOperator (عنصر العنصر ، السلسلة pathernode ، السلسلة الأب ، childname ، سلسلة childvalue ، عمل سلسلة ، خريطة mapattr) {
نتيجة السلسلة = "" ؛
قائمة العناصر = element.Elements () ؛
لـ (iterator it = elements.iterator () ؛ it.hasnext () ؛) {
element currentElement = (element) it.next () ؛
if (! currentelement.getName (). يساوي (fathernode)) {// متابعة البحث عندما لا يكون العنصر الحالي هو العنصر الأصل الذي نبحث عنه
XmlelementOperator (CurrentElement ، fathernode ، dofrondtr ، childname ، childvalue ، المشغل ، mapattr) ؛ // مكالمة متكررة
}آخر{
إذا (currentelement.attributeCount ()> 0) {// عندما يكون للعنصر الحالي قيمة سمة ، فهو موجود
لـ (قائمة ITerator = currentElement.AttributeIrator () ؛ list.hasnext () ؛) {// transf قيمة السمة
Attribute ATTRIMER = (السمة) قائمة. next () ؛
if (attr.getValue (). يساوي (dofromattr)) {// تحديد العنصر الأصل الفريد استنادًا إلى قيمة السمة
if (compator.equals ("add")) {// إضافة عنصر
element childelement = currentElement.AddElement (idildname) ؛
childelement.settext (childvalue) ؛
iterator itmapattr = mapattr.keyset (). iterator () ؛
بينما (itmapattr.hasnext ()) {
مفتاح السلسلة = (سلسلة) itmapattr.next () ؛
قيمة السلسلة = mapattr.get (مفتاح) .ToString () ؛
childelement.setattributeValue (المفتاح ، القيمة) ؛
}
// childlement.setattributeValue ("id" ، "M1") ؛
// childlement.setattributeValue ("name" ، "module1") ؛
// childlement.setattributeValue ("url" ، "index1.jsp") ؛
} آخر إذا (المشغل.
قائمة الأطفال = currentElement.Elements (idildname) ؛ // احصل على جميع العقد الفرعية تحت العقدة الحالية ، وحكم على قيمهم ، وتعديلها
لـ (ايتراتور الأطفال = اولاد.
عنصر الجميع = (عنصر) childs.next () ؛
الجميع.
}
} آخر إذا (المشغل.
قائمة الأطفال = currentElement.Elements () ؛ // الحصول على جميع العقد الفرعية تحت العقدة الحالية ، والحكم على قيمهم ، وتعديلها
لـ (ايتراتور الأطفال = اولاد.
عنصر الجميع = (عنصر) childs.next () ؛
CurrentElement.remove (الجميع) ؛
}
} آخر إذا (المشغل.
قائمة الأطفال = currentElement.Elements (idildname) ؛ // احصل على جميع العقد الفرعية تحت العقدة الحالية ، وحكم على قيمهم ، وتعديلها
لـ (ايتراتور الأطفال = اولاد.
عنصر الجميع = (عنصر) childs.next () ؛
// result = eLLOLY.GETTEXT () ؛
النتيجة = alulding.attributeValue ("id")+"،"+result ؛
}
}
آخر{
// كتابة سجل
// string loginfo = "Xmlfile Operator غير موجود!" ؛
// 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 (FILEWRITER جديد (ملف جديد (FILEPATH)) ، FORMAT) ؛
Writer.write (وثيقة) ؛
الكاتب.
} catch (استثناء e) {
// string loginfo = stacktracetoString.getExceptionTrace (e) ؛
// writelog.writelogtoend ("localservermanager" ، loginfo) ؛
}
}
/**
* تحديد ما إذا كان ملف XML موجودًا.
* param اسم الملف
* @يعود
*/
ملف منطقي خاص () {
java.io.file objfile = new java.io.file (this.filepath) ؛
if (objfile.exists ()) {
العودة صحيح.
} آخر {
العودة كاذبة
}
}
}
ملف XML:
نسخة الكود كما يلي:
<؟
<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. لكتابة الكثير من التكرار ، هناك مشكلة في الكود الذي يجب تعديله بشكل متكرر ، لذلك في بعض الأحيان ، على الرغم من أن المتطلبات مهمة ، فإن كيفية تنفيذها بنفس القدر من الأهمية!