أصبح XML الآن تنسيقًا عالميًا لتبادل البيانات، مما يوفر استقلال النظام الأساسي واستقلال اللغة واستقلال النظام راحة كبيرة في تكامل البيانات وتفاعلها. للحصول على المعرفة النحوية والتفاصيل الفنية لـ XML نفسها، تحتاج إلى قراءة الأدبيات الفنية ذات الصلة، والتي تتضمن DOM (نموذج كائن المستند)، DTD (تعريف نوع المستند)، SAX (واجهة برمجة تطبيقات بسيطة لـ XML)، XSD (تعريف مخطط XML)) ، XSLT (تحويلات لغة أوراق الأنماط القابلة للتوسيع)، للحصول على التفاصيل، يرجى الرجوع إلى مستند موقع ويب w3c الرسمي http://www.w3.org لمزيد من المعلومات.
يتم تحليل XML بنفس الطريقة في لغات مختلفة، ولكن بناء الجملة المطبق مختلف. هناك طريقتان أساسيتان للتحليل، إحداهما تسمى SAX والأخرى تسمى DOM. يعتمد SAX على تحليل دفق الأحداث، ويعتمد DOM على تحليل بنية شجرة مستندات XML. لنفترض أن محتوى وبنية XML الخاصة بنا هي كما يلي:
انسخ رمز الكود كما يلي:
<?xml version="1.0" encoding="UTF-8"?>
<الموظفون>
<الموظف>
<name>ddviplinux</name>
<sex>م</sex>
<العمر>30</العمر>
</الموظف>
</الموظفين>
تستخدم هذه المقالة لغة JAVA لتنفيذ إنشاء مستند XML وتحليل DOM وSAX.
قم أولاً بتعريف واجهة لتشغيل مستندات XML، وهي XmlDocument وهي تحدد الواجهة لإنشاء مستندات XML وتحليلها.
انسخ رمز الكود كما يلي:
الحزمة com.alisoft.facepay.framework.bean;
/**
*
* @ المؤلف hongliang.dinghl
* تحديد الواجهة لإنشاء وتحليل مستندات XML
*/
الواجهة العامة XmlDocument {
/**
* إنشاء وثيقة XML
* @param fileName اسم المسار الكامل للملف
*/
public void createXml(String fileName);
/**
* تحليل وثائق XML
* @param fileName اسم المسار الكامل للملف
*/
public void parserXml(String fileName);
}
1.DOM يقوم بإنشاء وتحليل مستندات XML
يتم تعريف مجموعة من الواجهات للإصدار الذي تم تحليله من مستند XML. يقرأ المحلل اللغوي المستند بأكمله ويبني بنية شجرة مقيمة في الذاكرة والتي يمكن للرمز معالجتها بعد ذلك باستخدام واجهة DOM. المزايا: شجرة المستندات بأكملها موجودة في الذاكرة، وسهلة التشغيل؛ وتدعم وظائف متعددة مثل الحذف والتعديل وإعادة الترتيب؛ العيوب: يؤدي نقل المستند بأكمله إلى الذاكرة (بما في ذلك العقد غير المفيدة) إلى إهدار الوقت والمساحة؛ مناسبات الاستخدام: بمجرد تحليل المستندات؛ تحتاج أيضًا إلى الوصول إلى هذه البيانات عدة مرات، وموارد الأجهزة كافية (الذاكرة، وحدة المعالجة المركزية).
انسخ رمز الكود كما يلي:
الحزمة com.alisoft.facepay.framework.bean;
استيراد java.io.FileInputStream؛
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
استيراد java.io.InputStream؛
import java.io.PrintWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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.SAXException;
/**
*
* @ المؤلف hongliang.dinghl
* إنشاء DOM وتحليل مستندات XML
*/
الطبقة العامة DomDemo تنفذ XmlDocument {
وثيقة وثيقة خاصة؛
اسم ملف سلسلة خاص؛
الحرف الفراغي العام () {
يحاول {
DocumentBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder =factory.newDocumentBuilder();
this.document = builder.newDocument();
} التقاط (ParserConfigurationException e) {
System.out.println(e.getMessage());
}
}
إنشاء الفراغ العام (اسم ملف السلسلة) {
جذر العنصر = this.document.createElement("employees");
this.document.appendChild(root);
موظف العنصر = this.document.createElement("employee");
اسم العنصر = this.document.createElement("name");
name.appendChild(this.document.createTextNode("Ding Hongliang"));
user.appendChild(name);
عنصر الجنس = this.document.createElement("sex");
sex.appendChild(this.document.createTextNode("m"));
user.appendChild(sex);
عمر العنصر = this.document.createElement("age");
age.appendChild(this.document.createTextNode("30"));
user.appendChild(age);
root.appendChild(employee);
TransformerFactory tf = TransformerFactory.newInstance();
يحاول {
محول المحول = tf.newTransformer();
مصدر DOMSource = جديد DOMSource(document);
Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
Transformer.setOutputProperty(OutputKeys.INDENT, "yes");
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
نتيجة StreamResult = جديد StreamResult(pw);
Transformer.transform(source, result);
System.out.println("تم إنشاء ملف XML بنجاح!");
} التقاط (TransformerConfigurationException e) {
System.out.println(e.getMessage());
} قبض على (IllegalArgumentException e) {
System.out.println(e.getMessage());
} قبض على (FileNotFoundException ه) {
System.out.println(e.getMessage());
} قبض على (TransformerException e) {
System.out.println(e.getMessage());
}
}
public void parserXml(String fileName) {
يحاول {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
مستند المستند = db.parse(fileName);
موظفو NodeList = document.getChildNodes();
for (int i = 0; i < users.getLength(); i++) {
موظف العقدة = الموظفين.item(i);
NodeList memberInfo = member.getChildNodes();
for (int j = 0; j < memberInfo.getLength(); j++) {
العقدة العقدة = الموظفInfo.item(j);
NodeList memberMeta =node.getChildNodes();
for (int k = 0; k < memberMeta.getLength(); k++) {
System.out.println(employeeMeta.item(k).getNodeName()
+ ": " + memberMeta.item(k).getTextContent());
}
}
}
System.out.println("اكتمل التحليل");
} قبض على (FileNotFoundException ه) {
System.out.println(e.getMessage());
} التقاط (ParserConfigurationException e) {
System.out.println(e.getMessage());
} قبض (SAXException ه) {
System.out.println(e.getMessage());
} قبض (IOException ه) {
System.out.println(e.getMessage());
}
}
}
2. يقوم SAX بإنشاء مستندات XML وتحليلها
لحل مشكلة DOM، ظهر SAX. SAX، مدفوع بالحدث. عندما يعثر المحلل اللغوي على بداية عنصر، نهاية عنصر، بداية أو نهاية نص، مستند، وما إلى ذلك، فإنه يرسل الأحداث، ويقوم المبرمجون بكتابة التعليمات البرمجية التي تستجيب لهذه الأحداث وتحفظ البيانات. المزايا: ليست هناك حاجة لتحميل المستند بأكمله مسبقًا، ويستهلك موارد أقل؛ رمز محلل SAX أصغر من رمز محلل DOM، وهو مناسب للتطبيق الصغير والتنزيل. العيوب: غير مستمرة بعد الحدث، إذا لم يتم حفظ البيانات، فستفقد البيانات؛ يمكن الحصول على النص فقط من الحدث، ولكن لا يُعرف العنصر الذي ينتمي إليه النص: التطبيق الصغير فقط؛ مستند XML كمية صغيرة من المحتوى، نادرًا ما تتم إعادة النظر فيه؛ ذاكرة الآلة قليلة؛
كود جافا
انسخ رمز الكود كما يلي:
الحزمة com.alisoft.facepay.framework.bean;
استيراد java.io.FileInputStream؛
import java.io.FileNotFoundException;
import java.io.IOException;
استيراد java.io.InputStream؛
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* @ المؤلف hongliang.dinghl
* تحليل مستند SAX
*/
الطبقة العامة SaxDemo تنفذ XmlDocument {
إنشاء الفراغ العام (اسم ملف السلسلة) {
System.out.println("<<"+filename+">>");
}
public void parserXml(String fileName) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
يحاول {
SAXParser saxparser = saxfac.newSAXParser();
InputStream is = new FileInputStream(fileName);
saxparser.parse(is, new MySAXHandler());
} التقاط (ParserConfigurationException e) {
printStackTrace();
} قبض (SAXException ه) {
printStackTrace();
} قبض على (FileNotFoundException ه) {
printStackTrace();
} قبض (IOException ه) {
printStackTrace();
}
}
}
فئة MySAXHandler تمتد DefaultHandler {
boolean hasAttribute = false;
سمات السمات = فارغة؛
public void startDocument() يلقي SAXException {
System.out.println("بدأت طباعة المستند");
}
endDocument () الفراغ العام يلقي SAXException {
System.out.println("انتهت طباعة المستند");
}
startElement باطلة عامة (سلسلة uri، String localName، String qName،
سمات السمات) يطرح SAXException {
إذا (qName.equals("الموظفين")) {
يعود؛
}
إذا (qName.equals("الموظف")) {
System.out.println(qName);
}
إذا (attributes.getLength() > 0) {
this.attributes = attributes;
this.hasAttribute = true;
}
}
endElement الفراغ العام (String uri، String localName، String qName)
يرمي SAXException {
إذا (hasAttribute && (attributes != null)) {
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ attributes.getValue(0));
}
}
}
أحرف باطلة عامة (char [] ch، int start، int length)
يرمي SAXException {
System.out.println(new String(ch, start, length));
}
}
الحزمة com.alisoft.facepay.framework.bean;
استيراد java.io.FileInputStream؛
import java.io.FileNotFoundException;
import java.io.IOException;
استيراد java.io.InputStream؛
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* @ المؤلف hongliang.dinghl
* تحليل مستند SAX
*/
الطبقة العامة SaxDemo تنفذ XmlDocument {
إنشاء الفراغ العام (اسم ملف السلسلة) {
System.out.println("<<"+filename+">>");
}
public void parserXml(String fileName) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
يحاول {
SAXParser saxparser = saxfac.newSAXParser();
InputStream is = new FileInputStream(fileName);
saxparser.parse(is, new MySAXHandler());
} التقاط (ParserConfigurationException e) {
printStackTrace();
} قبض (SAXException ه) {
printStackTrace();
} قبض على (FileNotFoundException ه) {
printStackTrace();
} قبض (IOException ه) {
printStackTrace();
}
}
}
فئة MySAXHandler تمتد DefaultHandler {
boolean hasAttribute = false;
سمات السمات = فارغة؛
public void startDocument() يلقي SAXException {
System.out.println("بدأت طباعة المستند");
}
endDocument () الفراغ العام يطرح SAXException {
System.out.println("انتهت طباعة المستند");
}
startElement باطلة عامة (سلسلة uri، String localName، String qName،
سمات السمات) يطرح SAXException {
إذا (qName.equals("الموظفين")) {
يعود؛
}
إذا (qName.equals("الموظف")) {
System.out.println(qName);
}
إذا (attributes.getLength() > 0) {
this.attributes = attributes;
this.hasAttribute = true;
}
}
endElement الفراغ العام (سلسلة uri، سلسلة localName، سلسلة qName)
يرمي SAXException {
إذا (hasAttribute && (attributes != null)) {
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ attributes.getValue(0));
}
}
}
أحرف باطلة عامة (char [] ch، int start، int length)
يرمي SAXException {
System.out.println(new String(ch, start, length));
}
}
3.DOM4J يقوم بإنشاء وتحليل مستندات XML
DOM4J عبارة عن Java XML API ممتاز جدًا، ويتميز بأداء ممتاز ووظائف قوية وسهولة شديدة في الاستخدام، كما أنه برنامج مفتوح المصدر. في الوقت الحاضر، يمكنك أن ترى أن المزيد والمزيد من برامج Java تستخدم DOM4J لقراءة وكتابة XML. ومن الجدير بالذكر أنه حتى JAXM من Sun يستخدم أيضًا DOM4J.
كود جافا
انسخ رمز الكود كما يلي:
الحزمة com.alisoft.facepay.framework.bean;
استيراد java.io.File؛
import java.io.FileWriter;
import java.io.IOException;
استيراد java.io.Writer؛
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
*
* @ المؤلف hongliang.dinghl
* يقوم Dom4j بإنشاء مستندات XML وتحليل مستندات XML
*/
الطبقة العامة Dom4jDemo تنفذ XmlDocument {
إنشاء الفراغ العام (اسم ملف السلسلة) {
مستند المستند = DocumentHelper.createDocument();
موظفو العنصر=document.addElement("الموظفون");
العنصر الموظف=employees.addElement("employee");
اسم العنصر = الموظف.addElement("name");
name.setText("ddvip");
العنصر sex=employee.addElement("sex");
sex.setText("م");
العنصر age=employee.addElement("age");
age.setText("29");
يحاول {
الكاتب fileWriter=new FileWriter(fileName);
XMLWriter xmlWriter=new XMLWriter(fileWriter);
xmlWriter.write(document);
xmlWriter. Close();
} قبض (IOException ه) {
System.out.println(e.getMessage());
}
}
public void parserXml(String fileName) {
File inputXml=new File(fileName);
SAXReader saxReader = new SAXReader();
يحاول {
مستند المستند = saxReader.read(inputXml);
موظفو العنصر=document.getRootElement();
for(Iterator i = users.elementIterator(); i.hasNext();){
موظف العنصر = (العنصر) i.next();
for(Iterator j = member.elementIterator(); j.hasNext();){
عقدة العنصر=(العنصر) j.next();
System.out.println(node.getName()+":":+node.getText());
}
}
} قبض على (DocumentException e) {
System.out.println(e.getMessage());
}
System.out.println("dom4j parserXml");
}
}
4.JDOM يقوم بإنشاء وتحليل XML
من أجل تقليل كمية الترميز لـ DOM وSAX، ظهرت مزايا JDOM: مبدأ 20-80 يقلل بشكل كبير من كمية التعليمات البرمجية. مناسبات الاستخدام: الوظائف التي سيتم تنفيذها بسيطة، مثل التحليل والإنشاء وما إلى ذلك، ولكن في المستوى الأدنى، لا يزال JDOM يستخدم مستندات SAX (الأكثر استخدامًا) وDOM وXanan.
انسخ رمز الكود كما يلي:
الحزمة com.alisoft.facepay.framework.bean;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
/**
*
* @ المؤلف hongliang.dinghl
* تقوم JDOM بإنشاء مستندات XML وتحليلها
*
*/
الطبقة العامة JDomDemo تنفذ XmlDocument {
إنشاء الفراغ العام (اسم ملف السلسلة) {
وثيقة الوثيقة؛
جذر العنصر؛
root=new Element("الموظفون");
document=new Document(root);
موظف العنصر=عنصر جديد("الموظف");
root.addContent(employee);
اسم العنصر=عنصر جديد("اسم");
name.setText("ddvip");
job.addContent(name);
العنصر sex=new Element("sex");
sex.setText("م");
job.addContent(sex);
عمر العنصر=عنصر جديد("age");
age.setText("23");
job.addContent(age);
XMLOutputter XMLOut = new XMLOutputter();
يحاول {
XMLOut.output(document, new FileOutputStream(fileName));
} قبض على (FileNotFoundException ه) {
printStackTrace();
} قبض (IOException ه) {
printStackTrace();
}
}
public void parserXml(String fileName) {
SAXBuilder builder=new SAXBuilder(false);
يحاول {
وثيقة الوثيقة=builder.build(fileName);
موظفو العنصر=document.getRootElement();
قائمة الموظفينList=employees.getChildren("employee");
for(int i=0;iElement member=(Element)employeeList.get(i);
قائمة jobInfo=employee.getChildren();
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":":+((Element)employeeInfo.get(j)).getValue());
}
}
} مسك (JDOMException e) {
printStackTrace();
} قبض (IOException ه) {
printStackTrace();
}
}
}