أفضل طريقة لتحليل مستندات XML المخصصة المتنوعة في Java
سؤال
ما هي أفضل طريقة لتحليل مستندات XML متعددة ومنفصلة ومخصصة باستخدام Java؟
نصائح أخرى
في الأساس، لديك طريقتان رئيسيتان لتحليل XML في Java:
- ساكس, ، حيث تستخدم معالج للحصول على ما تريده فقط في ملف XML الخاص بك والتخلص من الباقي
- DOM, ، الذي يوزع ملفك طوال الوقت، ويسمح لك بالتقاط جميع العناصر بطريقة تشبه الشجرة.
هناك طريقة أخرى مفيدة جدًا لتحليل XML، وإن كانت أحدث قليلاً من هذه الطرق، وتم تضمينها في JRE فقط منذ Java6، وهي ستاكس.تم تصميم StAX كطريقة وسطية بين نهج DOM القائم على الشجرة ونهج SAX القائم على الحدث.إنه مشابه تمامًا لـ SAX في حقيقة أن تحليل المستندات الكبيرة جدًا أمر سهل، ولكن في هذه الحالة "يسحب" التطبيق المعلومات من المحلل اللغوي، بدلاً من تحليل أحداث "الدفع" إلى التطبيق.يمكنك العثور على مزيد من التوضيح حول هذا الموضوع هنا.
لذا، اعتمادًا على ما تريد تحقيقه، يمكنك استخدام أحد هذه الأساليب.
سوف ترغب في استخدامها org.xml.sax.XMLReader
(http://docs.Oracle.com/javase/7/docs/api/org/xml/sax/XMLReader.html).
إذا كنت تحتاج فقط إلى التحليل فإنني أوصي باستخدام مكتبة XPath.وهنا مرجع جميل: http://www.ibm.com/developerworks/library/x-javaxpathapi.html
ولكن قد ترغب في التفكير في تحويل XMLs إلى كائنات ثم السماء هي الحد الأقصى.لذلك يمكنك استخدام XStream, هذه مكتبة رائعة أستخدمها كثيرًا
استخدم ال dom4j مكتبة
اقرأ الوثيقة أولاً
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Foo {
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}
ثم استخدم XPATH للوصول إلى القيم التي تحتاجها
public void get_author(Document document) {
Node node = document.selectSingleNode( "//AppealRequestProcessRequest/author" );
String author = node.getText();
return author;
}
يوجد أدناه رمز استخراج بعض القيمة باستخدام vtd-xml.
import com.ximpleware.*;
public class extractValue{
public static void main(String s[]) throws VTDException, IOException{
VTDGen vg = new VTDGen();
if (!vg.parseFile("input.xml", false));
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/aa/bb[name='k1']/value");
int i=0;
while ((i=ap.evalXPath())!=-1){
System.out.println(" value ===>"+vn.toString(i));
}
}
}