1 4 طرق لتحليل ملفات XML
هناك أربع طرق كلاسيكية لتحليل ملفات XML. هناك طريقتان أساسيتان للتحليل، إحداهما تسمى SAX والأخرى تسمى DOM. يعتمد SAX على تحليل دفق الأحداث، ويعتمد DOM على تحليل بنية شجرة مستندات XML. على هذا الأساس، من أجل تقليل كمية الترميز لـ DOM وSAX، ظهرت JDOM وميزتها هي أن مبدأ 20-80 (مبدأ باريتو) يقلل بشكل كبير من كمية التعليمات البرمجية. في الظروف العادية، يتم استخدام JDOM لتلبية الوظائف البسيطة التي سيتم تنفيذها، مثل التحليل والإنشاء وما إلى ذلك. ولكن في المستوى الأدنى، لا يزال JDOM يستخدم مستندات SAX (الأكثر استخدامًا)، وDOM، وXanan. أما الآخر فهو DOM4J، وهو عبارة عن Java XML API ممتاز جدًا مع أداء ممتاز ووظائف قوية وسهولة الاستخدام القصوى، وهو أيضًا برنامج مفتوح المصدر. في الوقت الحاضر، يمكنك أن ترى أن المزيد والمزيد من برامج Java تستخدم DOM4J لقراءة وكتابة XML. ومن الجدير بالذكر أنه حتى JAXM من Sun يستخدم أيضًا DOM4J. لمعرفة الاستخدام المحدد للطرق الأربع، ابحث في Baidu وستجد العديد من المقدمات التفصيلية.
2 مقدمة مختصرة عن XPath
XPath هي لغة للعثور على المعلومات في مستندات XML. يتم استخدام XPath للتنقل عبر العناصر والسمات في مستندات XML، ولاجتياز العناصر والسمات. يعد XPath عنصرًا رئيسيًا في معيار W3C XSLT، وقد تم بناء كل من XQuery وXPointer على تعبيرات XPath. ولذلك، فإن فهم XPath هو الأساس للعديد من تطبيقات XML المتقدمة. XPath يشبه إلى حد كبير لغة SQL لعمليات قاعدة البيانات، أو JQuery، مما يسهل على المطورين الحصول على ما يحتاجون إليه في المستند. يدعم DOM4J أيضًا استخدام XPath.
3 DOM4J باستخدام XPath
عندما يستخدم DOM4J XPath لتحليل مستندات XML، فإنك تحتاج أولاً إلى الإشارة إلى حزمتي JAR في المشروع:
dom4j-1.6.1.jar: حزمة برامج DOM4J، عنوان التنزيل http://sourceforge.net/projects/dom4j/؛
jaxen-xx.xx.jar: عادةً إذا لم تتم إضافة هذه الحزمة، فسيتم طرح استثناء (java.lang.NoClassDefFoundError: org/jaxen/JaxenException). عنوان التنزيل هو http://www.jaxen.org/releases .html.
3.1 تدخل مساحة الاسم
عند معالجة ملفات xml المحولة من ملفات Excel أو ملفات بتنسيق آخر، غالبًا ما نواجه مواقف لا يمكن فيها الحصول على نتائج من خلال تحليل XPath. عادةً ما يحدث هذا الموقف بسبب وجود مساحات الأسماء. خذ ملف XML بالمحتوى التالي كمثال، إذا قمت بإجراء بحث بسيط من خلال XPath =" // Workbook/ Worksheet / Table / Row[1]/ Cell[1]/Data[1] "، عادةً لن تظهر أي نتائج يظهر. يحدث هذا بسبب مساحة الاسم (xmlns='urn:schemas-microsoft-com:office:spreadsheet').
انسخ رمز الكود كما يلي:
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel " xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<ورقة العمل ss:Name="Sheet1">
<الجدول ss:ExpandedColumnCount="81" ss:ExpandedRowCount="687" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="52.5" ss:DefaultRowHeight="15.5625">
<صف ss:AutoFitHeight="0">
<الخلية>
<Data ss:Type="String">جرذ كتابة التعليمات البرمجية</Data>
</الخلية>
</صف>
<صف ss:AutoFitHeight="0">
<الخلية>
<Data ss:Type="String">مشمس</Data>
</الخلية>
</صف>
</الجدول>
</ورقة عمل>
</المصنف>
3.2 تحليل XPath لملفات xml بمساحات الأسماء
الطريقة الأولى (وظيفة read1()): استخدم local-name() وnamespace-uri() المصاحبين لبناء جملة XPath لتحديد اسم العقدة ومساحة الاسم التي تريد استخدامها. تعد كتابة تعبيرات XPath أكثر إزعاجًا.
الطريقة الثانية (وظيفة read2 ()): قم بتعيين مساحة الاسم XPath واستخدم وظيفة setNamespaceURIs ().
الطريقة الثالثة (وظيفة read3 ()): قم بتعيين مساحة الاسم DocumentFactory ()، والدالة المستخدمة هي setXPathNamespaceURIs (). تعد كتابة تعبيرات XPath بالطريقتين الثانية والثالثة أمرًا بسيطًا نسبيًا.
الطريقة الرابعة (وظيفة read4 ()): الطريقة هي نفس الطريقة الثالثة، لكن تعبير XPath مختلف (ينعكس بشكل خاص في البرنامج) وهو يهدف بشكل أساسي إلى اختبار الاختلاف في تعبير XPath، ويشير بشكل أساسي إلى الاكتمال وما إذا كان سيؤثر على كفاءة الاسترجاع.
(تستخدم الطرق الأربع المذكورة أعلاه DOM4J مع XPath لتحليل ملفات XML)
الطريقة الخامسة (وظيفة read5 (): استخدم DOM مع XPath لتحليل ملف XML، بشكل أساسي لاختبار اختلاف الأداء.
لا شيء يتحدث بصوت أعلى من الكود! رمز حاسم!
انسخ رمز الكود كما يلي:
packageXPath;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.xpath.XPathConstants;
importjavax.xml.xpath.XPathExpression;
importjavax.xml.xpath.XPathExpressionException;
importjavax.xml.xpath.XPathFactory;
importorg.dom4j.Document;
importorg.dom4j.DocumentException;
importorg.dom4j.Element;
importorg.dom4j.XPath;
importorg.dom4j.io.SAXReader;
importorg.w3c.dom.NodeList;
importorg.xml.sax.SAXException;
/**
*DOM4JDOMXMLXPath
*/
publicclassTestDom4jXpath{
publicstaticvoidmain(String[]args){
read1();
read2();
read3();
read4(); //read3() الطريقة هي نفسها، لكن تعبير XPath مختلف
read5();
}
publicstaticvoidread1(){
/*
*uselocal-name() وnamespace-uri() في XPath
*/
يحاول{
longstartTime=System.currentTimeMillis();
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.read(in);
/*Stringxpath="//*[local-name()='Workbook'andnamespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']"
+"/*[local-name()='ورقة العمل']"
+"/*[local-name()='الجدول']"
+"/*[local-name()='الصف'][4]"
+"/*[local-name()='الخلية'][3]"
+"/*[local-name()='Data'][1]";*/
Stringxpath="//*[local-name()='Row'][4]/*[local-name()='Cell'][3]/*[local-name()='Data'][ 1]";
System.err.println("======uselocal-name()andnamespace-uri()inXPath====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("تم إلغاء التحديد")
List<Element>list=doc.selectNodes(xpath);
ل(كائن: قائمة){
Elemente=(العنصر)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("وقت تشغيل البرنامج:"+(endTime-startTime)+"ms");
}
}قبض(DocumentExceptione){
printStackTrace();
}
}
publicstaticvoidread2(){
/*
*setxpathnamespace(setNamespaceURIs)
*/
يحاول{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
Map.put("Workbook"،"urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Documentdoc=reader.read(in);
Stringxpath = "// Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetNamespaceURIs()tosetxpathnamespace====");
System.err.println("XPath:"+xpath);
XPathx=doc.createXPath(xpath);
x.setNamespaceURIs(map);
@SuppressWarnings("تم إلغاء التحديد")
List<Element>list=x.selectNodes(doc);
ل(كائن: قائمة){
Elemente=(العنصر)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("وقت تشغيل البرنامج:"+(endTime-startTime)+"ms");
}
}قبض(DocumentExceptione){
printStackTrace();
}
}
publicstaticvoidread3(){
/*
*setDocumentFactory() مساحة الاسم (setXPathNamespaceURIs)
*/
يحاول{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
Map.put("Workbook"،"urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Reader.getDocumentFactory().setXPathNamespaceURIs(map);
Documentdoc=reader.read(in);
Stringxpath = "// Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("تم إلغاء التحديد")
List<Element>list=doc.selectNodes(xpath);
ل(كائن: قائمة){
Elemente=(العنصر)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("وقت تشغيل البرنامج:"+(endTime-startTime)+"ms");
}
}قبض(DocumentExceptione){
printStackTrace();
}
}
publicstaticvoidread4(){
/*
*نفس طريقة read3()، لكن تعبير XPath مختلف
*/
يحاول{
longstartTime=System.currentTimeMillis();
Mapmap=newHashMap();
Map.put("Workbook"،"urn:schemas-microsoft-com:office:spreadsheet");
SAXReaderreader=newSAXReader();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
Reader.getDocumentFactory().setXPathNamespaceURIs(map);
Documentdoc=reader.read(in);
Stringxpath = "// Workbook:Worksheet/Workbook:Table/Workbook:Row[4]/Workbook:Cell[3]/Workbook:Data[1]";
System.err.println("======usesetXPathNamespaceURIs()tosetDocumentFactory()namespace====");
System.err.println("XPath:"+xpath);
@SuppressWarnings("تم إلغاء التحديد")
List<Element>list=doc.selectNodes(xpath);
ل(كائن: قائمة){
Elemente=(العنصر)o;
Stringshow=e.getStringValue();
System.out.println("show="+show);
longendTime=System.currentTimeMillis();
System.out.println("وقت تشغيل البرنامج:"+(endTime-startTime)+"ms");
}
}قبض(DocumentExceptione){
printStackTrace();
}
}
publicstaticvoidread5(){
/*
*دوماندكسباث
*/
يحاول{
longstartTime=System.currentTimeMillis();
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
DocumentBuilderbuilder=dbf.newDocumentBuilder();
InputStreamin=TestDom4jXpath.class.getClassLoader().getResourceAsStream("XPath//XXX.xml");
org.w3c.dom.Documentdoc=builder.parse(in);
XPathFactoryfactory=XPathFactory.newInstance();
javax.xml.xpath.XPathx=factory.newXPath();
// حدد سمة الاسم لجميع عناصر الفصل
Stringxpath = "// Workbook/Worksheet/Table/Row[4]/Cell[3]/Data[1]";
System.err.println("======DomXPath====");
System.err.println("XPath:"+xpath);
XPathExpressionexpr=x.compile(xpath);
NodeListnodes=(NodeList)expr.evaluate(doc,XPathConstants.NODE);
for(inti=0;i<nodes.getLength();i++){
System.out.println("show="+nodes.item(i).getNodeValue());
longendTime=System.currentTimeMillis();
System.out.println("وقت تشغيل البرنامج:"+(endTime-startTime)+"ms");
}
}catch(XPathExpressionExceptione){
printStackTrace();
}قبض على(ParserConfigurationExceptione){
printStackTrace();
}قبض(SAXExceptione){
printStackTrace();
}قبض(IOExceptione){
printStackTrace();
}
}
}
ملاحظة: فيما يلي العديد من الأدوات عبر الإنترنت لعمليات XML للرجوع إليها:
أداة تحويل XML/JSON عبر الإنترنت:
http://tools.VeVB.COm/code/xmljson
تنسيق XML عبر الإنترنت/ضغط XML عبر الإنترنت:
http://tools.VeVB.COm/code/xmlformat
أداة ضغط/تنسيق XML عبر الإنترنت:
http://tools.VeVB.COm/code/xml_format_compress