1. مقدمة
DOM4J هي واجهة برمجة تطبيقات Java Open Source ممتازة للغاية ، وتستخدم بشكل رئيسي لقراءة وكتابة مستندات XML ، مع أداء ممتاز ، وظائف قوية ، والاستخدام المريح للغاية. بالإضافة إلى ذلك ، غالبًا ما يتم استخدام XML في شركات تبادل البيانات ، مثل استدعاء المعلمات التي تم تمريرها بواسطة خدمة الويب ، وتنفيذ عمليات مزامنة البيانات ، لذلك من الضروري جدًا استخدام DOM4J لتحليل XML.
2. ظروف التحضير
DOM4J.JAR
تنزيل عنوان: http://sourceforge.net/projects/dom4j/
3. استخدم DOM4J للممارسة
1. تحليل وثيقة XML
أفكار التنفيذ:
<1> بعد قراءة مسار XML ، يتم تمريره إلى SaxReader وإرجاع كائن مستند وثيقة ؛
<2> ثم قم بتشغيل كائن المستند هذا للحصول على معلومات العقد والأطفال التالية ؛
الرمز المحدد كما يلي:
استيراد java.io.file ؛ استيراد javaiofileInputStream ؛ استيراد JavaioInputStream ؛ استيراد javautiliterator. استيراد javautillist. استيراد Ogdom4Jdocument ؛ استيراد Ogdom4jdocumentHelper ؛ استيراد Orgdom4Jelement ؛ استيراد Ogdom4JiosaxReader ؛ /** * استخدم DOM4J لتحليل مستندات XML * Author Administrator * */public class dom4jparsexmldemo {public void parsexml01 () {try {// تحويل xml أدناه src لإدخال inputstream inputStream = new fileInputStream ( // inputStream inputStream = thisgetClass () getResourCeasStream ("/modulexml") ؛ // يمكنك أيضًا العثور على XML استنادًا إلى المسار النسبي للملف المترجم للفئة // إنشاء قارئ SaxReader ، يستخدم على وجه التحديد لقراءة XML SaxReader SaxReader = New SaxReader () ؛ // وفقًا لطريقة إعادة كتابة القراءة في SaxReader ، يمكن قراءتها من خلال دفق الإدخال inputstream أو من خلال مستند كائن الملف // المستند = SaxReadEred (inputStream) ؛ مستند المستند = saxReadEredRead (ملف جديد ("D:/Project/DynamicWeb/SRC/Resource/Modulexml")) ؛ // يجب تحديد المسار المطلق للملف // بالإضافة إلى ذلك ، يمكن أيضًا استخدام محول XML المقدم من DocumentHelper. // document document = documentHelperParsExtext ("<؟ // احصل على العنصر الجذري للعقدة الجذرية = documentGetRootElement () ؛ SystemOutPrintln ("اسم عقدة الجذر:" + rootelementName ()) قيمة معرف سمة العقدة SystemeMoutPrintln ("النص في عقدة الجذر:" + ROOTElementGetText ()) ؛ // إذا كان العنصر يحتوي على أطفال ، فإنه يعيد سلسلة فارغة ، وإلا فإن النص في العقدة سيتم إرجاعه //s يتم عرض النص على الخط. SystemOutPrintln ("Text (1):" + rootelementTextTrim ()) ؛ // ما الذي تم إزالته هو مفتاح علامة التبويب وكسر الخط بين العلامة والعلامة ، وما إلى ذلك ، وليس المساحة قبل وبعد content systemoutprintln ("محتوى نص عقدة الجذر:" + rootelementGetRingValue ()) ؛ // إرجاع معلومات النص لجميع العقد الفرعية بشكل متكرر على العقدة الحالية. // الحصول على عنصر العقد الفرعية العنصر = rootelementElement ("الوحدة النمطية") ؛ إذا كانت (element! = null) {systemeputprintln ("نص العقدة الفرعية:" + elementGetText ()) ؛ // لأن عقدة الطفل وعقدة الجذر هي كائنات عناصر ، فإن طرق تشغيلها هي نفسها} // في بعض الحالات ، تكون XML أكثر تعقيدًا والمواصفات غير موحدة. لا يوجد JavalangnullPointerxception مباشرة لعقدة معينة ، لذلك بعد الحصول على كائن العنصر ، يجب أولاً تحديد ما إذا كان الجذور الفارغة ("الجذر") ؛ // دعم لتعديل اسم العقدة systemeputprintln ("" تم تعديل الاسم بعد عقدة الجذر: " + rootelementname ()) ؛ routelementsettext ("text") ؛ // ينطبق الشيء نفسه على تعديل النص في SystemOutPrintln ("النص بعد عقدة الجذر:" + rootelementgettext ()) ؛ } catch (استثناء e) {eprintstacktrace () ؛ }} public static void main (string [] args) {dom4jparsexmldemo demo = new dom4jparsexmldemo () ؛ demoparsexml01 () ؛ }}بالإضافة إلى ذلك ، فإن XML أعلاه تحت SRC ، الوحدة النمطية 01.xml كما يلي:
<؟
بعد ذلك ، قم بتنفيذ الطريقة الرئيسية لهذه الفئة ، وتأثير وحدة التحكم على النحو التالي:
من هذا نعرف:
<1> هناك العديد من الطرق لقراءة ملفات XML ؛
<2> من السهل جدًا إخراج النص والاسم الخاص بكائن العنصر ؛
<3> ومن المريح للغاية تعديل أسماء النص والتسمية للعناصر ، ولكن لن يتم كتابتها إلى ملفات XML Disk.
ما سبق يحصل ببساطة على عنصر الدليل الجذر لـ XML ، ثم يحلق من خلال كائن المستند المستند باستخدام ITerator ITerator.
الرمز المحدد كما يلي:
Public void parsexml02 () {try {// تحويل xml أدناه src إلى دفق الإدخال inputStream inputStream = thisgetClass () getResourCeasStream ("/modulexml") ؛ // إنشاء قارئ SaxReader خصيصًا لقراءة XML SaxReader SaxReader = New SaxReader () ؛ // وفقًا لطريقة Read Rewrite لـ SaxReader ، يمكن ملاحظة أنه يمكن قراءتها من خلال دفق الإدخال inputstream ، أو يمكن قراءته من خلال مستند كائن الملف = saxreaderread (inputStream) ؛ element rootelement = documentGetRootElement () ؛ ITerator <Element> modulesiterator = rootelementElements ("الوحدة النمطية") iterator () ؛ // rootelementElement ("الاسم") ؛ احصل على عنصر طفل معين // rootelementelements ("الاسم") ؛ احصل على مجموعة من عناصر الأطفال العقد moudule أسفل عقدة الجذر ، وإرجاع نوع مجموعة القائمة ///rotelementelements ("الوحدة النمطية") iterator () ؛ تكرار كل عنصر في مجموعة القائمة التي تم إرجاعها وإرجاع جميع العقد الفرعية إلى مجموعة ITerator بينما (ModulesIteratorHasNext ()) {element moduleElement = modulesiteratornext () ؛ element nameElement = moduleElementElement ("name") ؛ SystemOutPrintln (nameElementGetName () + ":" + nameElementGetText ()) ؛ element valuelement = moduleElementElement ("value") ؛ SystemOutPrintln (ValuelementGetName () + ":" + valuelementGetText ()) ؛ Element DescriptionElement = moduleElementElement ("Decpist") ؛ SystemOutPrintln (decripteCriptEntGetName () + ":" + discriptionElementGetText ()) ؛ }} catch (استثناء e) {eprintstacktrace () ؛ }} بالإضافة إلى ذلك ، فإن XML أعلاه تحت SRC ، MODULE02.XML كما يلي:
<؟
بعد ذلك ، قم بتنفيذ الطريقة الرئيسية لهذه الفئة ، وتأثير وحدة التحكم على النحو التالي:
من هذا نعرف:
<1> يتكرر DOM4J عبر العناصر الفرعية XML فعالة ومريحة للغاية ؛
ومع ذلك ، فإن ما سبق يكرر ببساطة عن عناصر العقدة الفرعية لـ XML ، ولكن إذا كانت قواعد XML أكثر تعقيدًا ، مثل Module03.XML التي سيتم اختبارها بعد ذلك ، فإن التفاصيل هي كما يلي:
<؟ </module> <module> <name> تكوين الإدارة </name> <value> لا شيء </value> <discript> تعليمات لإدارة التكوين </discript> <module id = "106"> name> إدارة النظام </name> <value> 0 </value> <script> confcor <script> الرقم </discript> </module> </module> </module> </sycles>
نظرًا لأن هياكلها مختلفة ، إذا تكررت مباشرة ، فسيتم الإبلاغ عن خطأ:
java.lang.nullpointerxception
لذلك تحتاج إلى استخدامه بعناية في هذا الوقت. لا يمكنك وضع العناصر مباشرة في التكرار في كل مرة. رمز التنفيذ المحدد كما يلي:
public parsexml03 () {try {// تحويل XML أدناه src إلى دفق الإدخال inputStream inputStream = thisgetClass () getResourCeasStream ("/modulexml") ؛ // إنشاء قارئ SaxReader خصيصًا لقراءة XML SaxReader SaxReader = New SaxReader () ؛ // وفقًا لطريقة Read Rewrite لـ SaxReader ، يمكن ملاحظة أنه يمكن قراءتها من خلال دفق الإدخال inputstream ، أو يمكن قراءته من خلال مستند كائن الملف = saxreaderread (inputStream) ؛ element rootelement = documentGetRootElement () ؛ if (rootelementElements ("الوحدة النمطية")! = null) {// لأن علامة الوحدة الأولى تحتوي فقط على محتوى ولا توجد عقد طفل ، iterator () هي javalangnullpointerxception ، لذلك تحتاج إلى تنفيذ قائمة <element> elementlist = rootelementElements ("الوحدة النمطية") ؛ for (element element: elementList) {if (! elementGetTextTrim () equals ("")) {systemoutPrintln ("【1】" + elementGetTextTrim ()) ؛ } آخر {element nameElement = elementElement ("name") ؛ SystemOutPrintln ("【2】" + nameElementName () + ":" + nameElementGetText ()) ؛ element valuelement = elementElement ("value") ؛ SystemOutPrintln ("【2】" + valuelementName () + ":" + valuelementGetText ()) ؛ element descriptionElement = elementElement ("Decpist") ؛ SystemOutPrintln ("【2】" + descriptionElementName () + ":" + descriptionElementGetText ()) ؛ قائمة <Element> subelementList = elementElements ("الوحدة النمطية") ؛ لـ (العنصر الفرعي: subelementlist) {if (! subelementTextTrim () يساوي ("")) {systemoutPrintln ("【3】" + subelementTextTrim ()) ؛ } else {element subNameElement = subectionElement ("name") ؛ SystemOutPrintln ("【3】" + SubNameElementName () + ":" + SubNameElementGetText ()) ؛ عنصر العنصر الفرعي = السلع الفرعية ("القيمة") ؛ SystemOutPrintln ("【3】" + subvalueElementName () + ":" + subvalueElementGetText ()) ؛ العنصر subdescriptelement = subrolementElement ("Decprived") ؛ SystemOutPrintln ("【3】" + subdescriptElementName () + ":" + subdescriptElementText ()) ؛ }}}}}} catch (استثناء e) {eprintstacktrace () ؛ }}بعد ذلك ، قم بتنفيذ الطريقة الرئيسية لهذه الفئة ، وتأثير وحدة التحكم على النحو التالي:
حسنًا ، يمكننا الآن حل مشكلة المراجع الفارغة في المستندات التكرارية.
بالإضافة إلى ذلك ، يمكن إعادة تمثيل الكود بالفعل ، لأن تشغيل إخراج عناصر الأطفال في الحلقة يكون متكررًا ، ويمكن تحسينه عن طريق التكرار ، لكن قابلية القراءة ستكون أسوأ قليلاً.
إذا كنت بحاجة أحيانًا إلى الحصول على جميع المعلومات النصية في XML ، أو أن تنسيق XML الذي يمرره الآخرون غير موحدين ، مثل الاسم في العلامة حساس للحالة ، على الرغم من أن XML ليس حساسًا للحالة ، إلا أنه يجب أن يظهر في أزواج. لذلك لتجنب ذلك ، يمكنك ببساطة تغيير جميع أسماء العلامات للاستفادة. الرمز المحدد كما يلي:
الفراغ الثابت العام (سلسلة [] args) {string str = "<؟ <؟ النظام </discript> </module> </songules> "؛ SystemUtPrintln (strreplaceall ("<[^<]*>" ، "_")) ؛ نمط نمط = patterncompile ("<[^<]*>") ؛ Matcher Matcher = PatternMatcher (Str) ؛ بينما (MatcherFind ()) {str = strreplaceall (MatcherGroup (0) ، MatcherGroup (0) toupperCase ()) ؛ } SystemOutPrintln (str) ؛ }بعد الجري ، تكون العروض كما يلي:
2. إنشاء مستند XML
يمكن لـ DOM4J تحليل XML ، وسيقوم بالتأكيد بإنشاء XML ، وهو أسهل في الاستخدام.
أفكار التنفيذ:
<1> يوفر DocumentHelper طريقة لإنشاء كائن مستند ؛
<2> قم بتشغيل كائن المستند هذا وأضف العقدة والنص والاسم والسمة ضمن العقدة ؛
<3> ثم استخدم كاتب XMLWriter لكتابة كائن المستند المغطى بالقرص ؛
الرمز المحدد كما يلي:
استيراد java.io.filewriter ؛ استيراد JavaioException ؛ استيراد javaiowriter. استيراد Ogdom4Jdocument ؛ استيراد Ogdom4jdocumentHelper ؛ استيراد Orgdom4Jelement ؛ استيراد OgDom4JiOxmlWriter ؛ /** * استخدم DOM4J لإنشاء مستندات XML * Author Administrator * */Public Class DOM4JBUILDXMLDEMO {public void build01 () {try {// documentHelper يوفر طريقة لإنشاء مستند كائن مستند = documentHelperCreatedOcument () ؛ // إضافة عنصر معلومات العقدة rootelement = documentaddelement ("الوحدات النمطية") ؛ // يمكن أن يستمر هذا في إضافة العقد الفرعية ، أو تحديد content routelementsettext ("هذه هي المعلومات النصية لعلامة الوحدة النمطية") ؛ element element = rootelementAdDelement ("module") ؛ element nameElement = elementAdDelement ("name") ؛ element valuelement = elementAdDelement ("value") ؛ Element DescriptionElement = elementAdDelement ("الوصف") ؛ nameElementSteTteSt ("الاسم") ؛ NameElementAdDattribute ("Language" ، "Java") ؛ // إضافة قيمة قيمة السمة لـ node valuelementsettext ("value") ؛ ValuelementAdDattribute ("لغة" ، "C#") ؛ DescriptionElementSettext ("الوصف") ؛ DescriptionElementAdDattribute ("Language" ، "SQL Server") ؛ SystemOutPrintln (documentSxml ()) ؛ // تحويل كائن المستند مباشرة إلى كاتب الإخراج سلسلة FILEWRITER = جديد 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 ، مما يشير إلى أن هذا هو تنسيق الترميز الافتراضي. إذا كنت ترغب في إعادة التخصيب ، يمكنك إضافة document.setxmlencoding ("GBK") ؛ قبل الكتابة إلى القرص.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.