1. المعرفة الأساسية:
هناك بشكل عام أربع طرق لجافا لتحليل XML: DOM، SAX، JDOM، وDOM4J.
2. مقدمة للاستخدام
1)، دوم
(1) مقدمة
تقوم الواجهة التي توفرها W3C (org.w3c.dom) بقراءة مستند XML بالكامل في الذاكرة وإنشاء شجرة DOM للعمل على كل عقدة. الميزة هي أن المستند بأكمله موجود دائمًا في الذاكرة، ويمكننا الوصول إلى أي عقدة في أي وقت، كما أن اجتياز الشجرة هو أيضًا عملية مألوفة نسبيًا، والعيب هو أنها تستهلك الذاكرة، ويجب علينا الانتظار حتى تتم قراءة جميع المستندات في الذاكرة قبل المعالجة.
(2) رمز العينة:
انسخ رمز الكود كما يلي:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<الجذر>
<الهاتف>
<نوع الاسم = "نوكيا">
<السعر>599</السعر>
<operator>CMCC</operator>
</نوع>
<نوع الاسم = "شاومي">
<السعر>699</السعر>
<operator>تشاينا نت</operator>
</نوع>
</الهاتف>
</الجذر>
انسخ رمز الكود كما يلي:
import java.io.ByteArrayOutputStream;
استيراد java.io.File؛
import java.io.FileOutputStream;
import java.io.IOException;
استيراد java.io.StringReader؛
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
الطبقة العامة XMLHandler {
XMLHandler العام () {
}
سلسلة عامة createXML(){
String xmlStr = null;
DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
يحاول {
DocumentBuilder builder =factory.newDocumentBuilder();
مستند المستند = builder.newDocument();
document.setXmlVersion("1.0");
جذر العنصر = document.createElement("root");
document.appendChild(root);
هاتف العنصر = document.createElement("TelePhone");
العنصر nokia = document.createElement("type");
nokia.setAttribute("name", "nokia");
سعر العنصرNokia = document.createElement("price");
السعرNokia.setTextContent("599");
nokia.appendChild(priceNokia);
عامل العنصرNokia = document.createElement("operator");
عامل التشغيلNokia.setTextContent("CMCC");
nokia.appendChild(operatorNokia);
phone.appendChild(nokia);
العنصر xiaomi = document.createElement("type");
xiaomi.setAttribute("name", "xiaomi");
سعر العنصرXiaoMi = document.createElement("price");
PriceXiaoMi.setTextContent("699");
xiaomi.appendChild(priceXiaoMi);
عامل العنصرXiaoMi = document.createElement("operator");
OperatorXiaoMi.setTextContent("ChinaNet");
xiaomi.appendChild(operatorXiaoMi);
phone.appendChild(xiaomi);
root.appendChild(telephone);
TransformerFactory transFactory = TransformerFactory.newInstance();
محول transFormer = transFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
// سلسلة التصدير
ByteArrayOutputStream bos = new ByteArrayOutputStream();
transFormer.transform(domSource, new StreamResult(bos));
xmlStr = bos.toString();
//-------
//حفظ كملف
ملف الملف = ملف جديد("TelePhone.xml");
إذا (! file.exists()){
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
StreamResult xmlResult = new StreamResult(out);
transFormer.transform(domSource, xmlResult);
//--------
} التقاط (ParserConfigurationException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}catch (TransformerConfigurationException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}قبض (TransformerException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
إرجاع xmlStr؛
}
محلل الفراغ العام XML (سلسلة strXML) {
DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
يحاول {
DocumentBuilder builder =factory.newDocumentBuilder();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
المستند doc = builder.parse(is);
العنصر rootElement = doc.getDocumentElement();
هواتف NodeList = rootElement.getElementsByTagName("type");
لـ (int i = 0; i <phones.getLength(); i++) {
نوع العقدة = Phones.item(i);
String phoneName = ((Element)type).getAttribute("name");
System.out.println("اسم الهاتف = "+اسم الهاتف);
خصائص NodeList = type.getChildNodes();
for (int j = 0; j < property.getLength(); j++) {
خاصية العقدة = property.item(j);
StringNodeName = property.getNodeName();
إذا (nodeName.equals("السعر")) {
سعر السلسلة=property.getFirstChild().getNodeValue();
System.out.println("price="+price);
} else if (nodeName.equals("operator")) {
Stringoperator=property.getFirstChild().getNodeValue();
System.out.println("operator="+operator);
}
}
}
} التقاط (ParserConfigurationException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}قبض (SAXException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
public static void main(String[] args) {
XMLHandler Handler = new XMLHandler();
String xml = Handler.createXML();
System.out.println(xml);
Handler.parserXML(xml);
}
}
(3) الفرق بين العنصر والعقدة (org.w3c.dom)
كائن العقدة هو نوع البيانات الرئيسي لنموذج كائن المستند بأكمله، وهو الكائن الأساسي في DOM ويمثل العقدة المجردة في شجرة المستند. ومع ذلك، في الاستخدام الفعلي، نادرًا ما يتم استخدام كائن Node مباشرةً، وبدلاً من ذلك، يتم استخدام الكائنات الفرعية Element وAtr وText وما إلى ذلك لكائن Node.
يمثل كائن العنصر عنصرًا في مستند HTML أو XML وهو الكائن الفرعي الرئيسي لفئة Node. يمكن أن يحتوي العنصر على سمات، لذلك لدى العنصر طرق للوصول إلى سماته.
العنصر الموروث من Node. العنصر هو تعريف صغير الحجم، ويجب أن يكون عقدة تحتوي على معلومات كاملة ليكون عنصرًا، مثل <div>...</div>. لكن العقدة ليست بالضرورة عنصرًا، ويجب أن يكون العنصر عقدة.
تحتوي العقدة على عدة أنواع فرعية: العنصر، والنص، والسمة، والجذر، والتعليق، ومساحة الاسم، وما إلى ذلك.
2)، ساكس
3)، جدوم
4)، DOM4J
(1) مقدمة
يعد dom4j حاليًا هو الأفضل في تحليل XML (يستخدم Hibernate وSun’s JAXM أيضًا dom4j لتحليل XML). وهو يشتمل على العديد من الوظائف التي تتجاوز تمثيل مستند XML الأساسي، بما في ذلك دعم XPath المتكامل ودعم مخطط XML والمعالجة المستندة إلى الأحداث للمستندات الكبيرة أو المتدفقة.
عند استخدام XPATH، قم بإضافة jaxen.jar، وإلا سيحدث الخطأ التالي:
انسخ رمز الكود كما يلي:
استثناء في مؤشر الترابط "الرئيسي" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
في org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
في org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
في org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
(2) رمز العينة:
انسخ رمز الكود كما يلي:
استيراد java.io.File؛
import java.io.FileWriter;
import java.io.IOException;
استيراد java.io.StringReader؛
import java.io.StringWriter;
import java.util.List;
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;
import org.xml.sax.InputSource;
الطبقة العامة XMLHandler {
XMLHandler العامة () {
// TODO كعب المنشئ الذي تم إنشاؤه تلقائيًا
}
سلسلة عامة createXML(){
String strXML = null;
مستند المستند = DocumentHelper.createDocument();
جذر العنصر = document.addElement("root");
هاتف العنصر = root.addElement("TelePhone");
العنصر nokia = phone.addElement("type");
nokia.addAttribute("name", "nokia");
Element Price_nokia = nokia.addElement("price");
Price_nokia.addText("599");
العنصر عامل التشغيل = nokia.addElement("operator");
عامل_نوكيا.addText("CMCC");
العنصر xiaomi = phone.addElement("type");
xiaomi.addAttribute("name", "xiaomi");
Element Price_xiaomi = xiaomi.addElement("price");
Price_xiaomi.addText("699");
العنصر عامل التشغيل_xiaomi = xiaomi.addElement("operator");
عامل_xiaomi.addText("ChinaNet");
//--------
StringWriter strWtr = new StringWriter();
تنسيق OutputFormat = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter =new XMLWriter(strWtr, format);
يحاول {
xmlWriter.write(document);
} قبض (IOException e1) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
e1.printStackTrace();
}
strXML = strWtr.toString();
//--------
//-------
//strXML=document.asXML();
//------
//-------------
ملف الملف = ملف جديد("TelePhone.xml");
إذا (ملف. موجود ()) {
file.delete();
}
يحاول {
file.createNewFile();
XMLWriter out = new XMLWriter(new FileWriter(file));
out.write(document);
out.flush();
out.Close();
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
//-------------
إرجاع strXML؛
}
محلل الفراغ العام XML (سلسلة strXML) {
قارئ SAXReader = جديد SAXReader();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
يحاول {
مستند المستند = Reader.read(is);
جذر العنصر = document.getRootElement();
//الحصول على العنصر
List<Element> phoneList = root.elements("TelePhone");
List<Element> typeList = phoneList.get(0).elements("type");
for (int i=0;i<typeList.size();i++){
عنصر العنصر = typeList.get(i);
String phoneName = element.attributeValue("name");
System.out.println("phonename = "+phoneName);
// الحصول على كافة العناصر
List<Element> ChildList = element.elements();
for (int j=0;j<childList.size();j++){
العنصر e = ChildList.get(j);
System.out.println(e.getName()+"="+e.getText());
}
}
} قبض على (DocumentException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
محلل الفراغ العامXMLbyXPath(String strXML){
قارئ SAXReader = جديد SAXReader();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
يحاول {
مستند المستند = Reader.read(is);
قائمة القائمة = document.selectNodes("/root/TelePhone/type");
for(int i=0;i<list.size();i++){
العنصر e = (العنصر) list.get(i);
System.out.println("phonename="+e.attributeValue("name"));
List list1 = e.selectNodes("./*");
for(int j=0;j<list1.size();j++){
العنصر e1 = (العنصر) list1.get(j);
System.out.println(e1.getName()+"="+e1.getText());
}
}
} قبض على (DocumentException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
XMLHandler Handler = new XMLHandler();
String strXML=handler.createXML();
System.out.println(strXML);
Handler.parserXML(strXML);
System.out.println("-----------");
Handler.parserXMLbyXPath(strXML);
}
}
5) إكس باث
(1) مقدمة
XPath هي لغة للعثور على المعلومات في مستندات XML. يتم استخدام XPath للتنقل عبر العناصر والسمات في مستندات XML.
للحصول على مقدمة بناء جملة محددة، يرجى الرجوع إلى: http://w3school.com.cn/xpath/index.asp
(2) رمز العينة:
انسخ رمز الكود كما يلي:
import java.io.IOException;
استيراد java.io.StringReader؛
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
استيراد javax.xml.xpath.XPath؛
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
الطبقة العامة XMLHandler {
XMLHandler العامة () {
// TODO كعب المنشئ الذي تم إنشاؤه تلقائيًا
}
محلل الفراغ العام XML (سلسلة strXML) {
DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
يحاول {
DocumentBuilder builder =factory.newDocumentBuilder();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
المستند doc = builder.parse(is);
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile("/root/TelePhone/type");
هواتف NodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
لـ (int i = 0; i <phones.getLength(); i++) {
نوع العقدة = Phones.item(i);
String phoneName = ((Element)type).getAttribute("name");
System.out.println("اسم الهاتف = "+اسم الهاتف);
XPathExpression expr1 = xpath.compile("./*");
NodeList list = (NodeList) expr1.evaluate(type, XPathConstants.NODESET);
for(int j =0;j<list.getLength();j++){
العنصر e1 = (العنصر) list.item(j);
System.out.println(e1.getNodeName()+"="+e1.getTextContent());
}
}
} التقاط (ParserConfigurationException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}قبض (SAXException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}قبض (XPathExpressionException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
String strXML="<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"no/"?>"+
"<الجذر>"+
"<الهاتف>"+
"<type name="nokia/">"+
"<price>599</price>"+
"<operator>CMCC</operator>"+
"</نوع>"+
"<type name="xiaomi/">"+
"<price>699</price>"+
"<operator>ChinaNet</operator>"+
"</نوع>"+
"</TelePhone>"+
"</الجذر>";
XMLHandler Handler = new XMLHandler();
Handler.parserXML(strXML);
}
}
ملاحظة: فيما يلي العديد من الأدوات عبر الإنترنت لعمليات 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