XML ist mittlerweile zu einem universellen Datenaustausch geworden Das Format bietet mit seiner Plattformunabhängigkeit, Sprachunabhängigkeit und Systemunabhängigkeit großen Komfort bei der Datenintegration und -interaktion. Für grammatikalische Kenntnisse und technische Details von XML selbst müssen Sie relevante Fachliteratur lesen, darunter DOM (Document Object Model), DTD (Document Type Definition), SAX (Simple API for XML) und XSD (Xml Schema Definition). , XSLT (Extensible Stylesheet Language Transformations), weitere Informationen finden Sie in der offiziellen Dokumentation der w3c-Website.
XML wird in verschiedenen Sprachen auf die gleiche Weise analysiert, die implementierte Syntax ist jedoch unterschiedlich. Es gibt zwei grundlegende Parsing-Methoden, eine heißt SAX und die andere heißt DOM. SAX basiert auf der Analyse von Ereignisströmen und DOM basiert auf der Analyse der XML-Dokumentbaumstruktur . Gehen Sie davon aus, dass der Inhalt und die Struktur unseres XML wie folgt sind:
<?xml version="1.0" encoding="UTF-8"?><employees><employee> <name>ddviplinux</name> <sex>m</sex> <age>30</age></employee></employees>
Dieser Artikel verwendet die JAVA-Sprache, um XML-Dokumente von DOM und SAX zu generieren und zu analysieren.
Definieren Sie zunächst eine Schnittstelle zum Betreiben von XML-Dokumenten, XmlDocument. Es definiert die Schnittstelle zum Erstellen und Parsen von XML-Dokumenten.
package com.beyond.framework.bean; /** * @author zhengwei * 定义XML文档建立与解析的接口 */ public interface XmlDocument { /** * 建立XML文档 * @param fileName 文件全路径名称 */ public void createXml(String fileName); /** * 解析XML文档 * @param fileName 文件全路径名称 */ public void parserXml(String fileName); }
1. DOMXML-Dokumente generieren und analysieren
Definiert eine Reihe von Schnittstellen für die analysierte Version eines XML-Dokuments. Der Parser liest das gesamte Dokument ein und erstellt eine speicherresidente Baumstruktur, die der Code dann mithilfe der DOM-Schnittstelle bearbeiten kann.
Vorteile: Der gesamte Dokumentbaum befindet sich im Speicher und ist einfach zu bedienen.
Nachteile: Das gesamte Dokument wird in den Speicher übertragen (einschließlich nutzloser Knoten). , eine Verschwendung von Zeit und Platz;
Verwendungszwecke: Sobald das Dokument analysiert ist, muss mehrmals auf die Daten zugegriffen werden;
DomDemo ==.document = = .document.createElement("employees"= .document.createElement("employee"= .document.createElement("name".document.createTextNode("丁宏亮"= .document.createElement("sex".document.createTextNode("m"= .document.createElement("age".document.createTextNode("30"=== "gb2312""yes"= PrintWriter(= "生成XML文件成功!" ==== ( i = 0; i < employees.getLength(); i++== ( j = 0; j < employeeInfo.getLength(); j++== ( k = 0; k < employeeMeta.getLength(); k+++ ":" +"解析完毕"
2. SAXXML-Dokumente generieren und analysieren
Um DOM zu lösen Das Problem tritt bei SAX auf. SAX, ereignisgesteuert. Wenn der Parser den Anfang eines Elements, das Ende eines Elements, den Anfang oder das Ende eines Textes, eines Dokuments usw. findet, sendet er Ereignisse, und Programmierer schreiben Code, der auf diese Ereignisse reagiert und die Daten speichert.
Vorteile: Es ist nicht erforderlich, das gesamte Dokument im Voraus zu laden, und es beansprucht weniger Ressourcen. Der SAX-Parser-Code ist kleiner als der DOM-Parser-Code und eignet sich für Applet und Download.
Nachteile: nicht dauerhaft; wenn die Daten nicht gespeichert werden, gehen die Daten nur zustandslos verloren; Sie wissen jedoch nicht, zu welchem Element der Text gehört zu;
Verwendungszwecke: Applet benötigt nur wenig Inhalt im XML-Dokument, seltener Zugriff auf den Maschinenspeicher; >
3. DOM4Jimport java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import 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;/*** @author zhengwei * SAX文档解析*/public class SaxDemo implements XmlDocument { public void createXml(String fileName) { System.out.println("<<"+filename+">>"); } public void parserXml(String fileName) { SAXParserFactory saxfac = SAXParserFactory.newInstance(); try { SAXParser saxparser = saxfac.newSAXParser(); InputStream is = new FileInputStream(fileName); saxparser.parse(is, new MySAXHandler()); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } class MySAXHandler extends DefaultHandler { boolean hasAttribute = false; Attributes attributes = null; public void startDocument() throws SAXException { System.out.println("文档开始打印了"); } public void endDocument() throws SAXException { System.out.println("文档打印结束了"); } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equals("employees")) { return; } if (qName.equals("employee")) { System.out.println(qName); } if (attributes.getLength() > 0) { this.attributes = attributes; this.hasAttribute = true; } } public void endElement(String uri, String localName, String qName) throws SAXException { if (hasAttribute && (attributes != null)) { for (int i = 0; i < attributes.getLength(); i++) { System.out.println(attributes.getQName(0) + attributes.getValue(0)); } } } public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch, start, length)); } }
DOM4J ist eine sehr, sehr ausgezeichnete Java-XML-API, mit hervorragender Leistung , leistungsstarke Funktionen und extrem einfach zu bedienen
BesondererPunkt, und es ist auch eine Open-Source-Software . Heutzutage sieht man, dass immer mehr Java-Software DOM4J zum Lesen und Schreiben von XML verwendet. Besonders erwähnenswert ist, dass sogar Suns JAXM auch DOM4J verwendet.
4. JDOMimport java.io.File; import java.io.FileWriter; import java.io.IOException; import 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; /** * @author zhengwei * Dom4j 生成XML文档与解析XML文档 */ public class Dom4jDemo implements XmlDocument { public void createXml(String fileName) { Document document = DocumentHelper.createDocument(); Element employees=document.addElement("employees"); Element employee=employees.addElement("employee"); Element name= employee.addElement("name"); name.setText("ddvip"); Element sex=employee.addElement("sex"); sex.setText("m"); Element age=employee.addElement("age"); age.setText("29"); try { Writer fileWriter=new FileWriter(fileName); XMLWriter xmlWriter=new XMLWriter(fileWriter); xmlWriter.write(document); xmlWriter.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } public void parserXml(String fileName) { File inputXml=new File(fileName); SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read(inputXml); Element employees=document.getRootElement(); for(Iterator i = employees.elementIterator(); i.hasNext();){ Element employee = (Element) i.next();for(Iterator j = employee.elementIterator(); j.hasNext();){ Element node=(Element) j.next(); System.out.println(node.getName()+":"+node.getText()); } } } catch (DocumentException e) { System.out.println(e.getMessage()); } System.out.println("dom4j parserXml"); } }
Um DOM zu reduzieren, Der Codierungsumfang in SAX erscheint mit JDOM. Vorteile: Das 20-80-Prinzip reduziert den Codeumfang erheblich.
Verwendungszwecke: Die zu implementierenden Funktionen sind einfach, z. B. Parsen, Erstellen usw., aber auf der untersten Ebene verwendet JDOM weiterhin SAX-Dokumente (am häufigsten verwendet), DOM und Xanan-Dokumente.5. Verwenden Sie dom4j zum Parsen von XML
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; /*** @author zhengwei * JDOM 生成与解析XML文档 */ public class JDomDemo implements XmlDocument { public void createXml(String fileName) { Document document; Element root; root=new Element("employees"); document=new Document(root); Element employee=new Element("employee"); root.addContent(employee); Element name=new Element("name"); name.setText("ddvip"); employee.addContent(name); Element sex=new Element("sex"); sex.setText("m"); employee.addContent(sex); Element age=new Element("age"); age.setText("23"); employee.addContent(age); XMLOutputter XMLOut = new XMLOutputter(); try { XMLOut.output(document, new FileOutputStream(fileName)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }public void parserXml(String fileName) { SAXBuilder builder=new SAXBuilder(false); try { Document document=builder.build(fileName); Element employees=document.getRootElement(); List employeeList=employees.getChildren("employee"); for(int i=0;i<EMPLOYEELIST.SIZE();I++){ iElement employee=(Element)employeeList.get(i); List employeeInfo=employee.getChildren(); for(int j=0;j<EMPLOYEEINFO.SIZE();J++){ System.out.println(((Element)employeeInfo.get(j)).getName()+":" +((Element)employeeInfo.get(j)).getValue()) } } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Die dom4j-API enthält ein Tool zum Parsen von XML-Dokumenten. Dieser Parser wird in diesem Artikel verwendet, um ein Beispiel-XML-Dokument zu erstellen.
Beispiel-XML-
) Verwenden Sie dann denselben Parser, um „catalog.xml“ zu ändern. Listing 2 ist das geänderte XML-Dokument „catalog-modified.xml“.
<?xml version="1.0" encoding="UTF-8"?> <catalog> <!--An XML Catalog--> <?target instruction?><journal title="XML Zone" publisher="IBM developerWorks"> <article level="Intermediate" date="December-2001"> <title>Java configuration with XML Schema</title> <author> <firstname>Marcello</firstname> <lastname>Vitaletti</lastname> </author> </article></journal> </catalog>
) Im Vergleich zur W3C-DOM-API besteht der Vorteil der Verwendung des in dom4j enthaltenen Parsers darin, dass dom4j über native XPath-Unterstützung verfügt. Der DOM-Parser unterstützt die Auswahl von Knoten mithilfe von XPath nicht.
<?xml version="1.0" encoding="UTF-8"?><catalog> <!--An XML catalog--><?target instruction?><journal title="XML Zone" publisher="IBM developerWorks"><article level="Introductory" date="October-2002"> <title>Create flexible and extensible XML schemas</title> <author><firstname>Ayesha</firstname> <lastname>Malik</lastname> </author> </article></journal></catalog>
Voreingestellt
Dokument erstellen
Dokument ändern
Voreinstellung
Dieser Parser kann von bezogen werden. Machen Sie dom4j-1.4/dom4j-full.jar im Klassenpfad zugänglich, der die dom4j-Klassen, die XPath-Engine sowie die SAX- und DOM-Schnittstellen umfasst. Wenn Sie bereits die im JAXP-Parser enthaltenen SAX- und DOM-Schnittstellen verwenden, fügen Sie dom4j-1.4/dom4j.jar zum Klassenpfad hinzu. dom4j.jar enthält die dom4j-Klasse und die XPath-Engine, jedoch keine SAX- und DOM-Schnittstellen.
Erstellen eines Dokuments
In diesem Abschnitt wird der Prozess der Erstellung eines XML-Dokuments mithilfe der dom4j-API erläutert und ein Beispiel-XML-Dokument „catalog.xml“ erstellt .
Verwenden Sie die Importanweisung, um die dom4j-API-Klasse zu importieren:
import org.dom4j.Element; |
Document document = DocumentHelper.createDocument(); |
Document document = DocumentHelper.createDocument(); td> |
Element catalogElement = document.addElement("catalog"); |
ElementkatalogElement = document.addElement("catalog");
|
Verwenden Sie die Methode addComment() im Katalogelement, um den Kommentar „Ein XML-Katalog“ hinzuzufügen.
|
Element journalElement = catalogElement.addElement("journal"); |
catalogElement.addProcessingInstruction("target","text"); |
journalElement.addAttribute("title", "XML Zone"); journalElement.addAttribute("publisher", "IBM developerWorks"); |
Element journalElement = CatalogElement.addElement("journal"); |
Element articleElement=journalElement.addElement("article"); |
journalElement.addAttribute("title", "XML Zone"); journalElement.addAttribute("publisher", "IBM DeveloperWorks"); |
articleElement.addAttribute("level", "Intermediate"); articleElement.addAttribute("date", "December-2001"); |
Element ArticleElement=journalElement.addElement("article");
|
Fügen Sie dem Artikelelement Ebenen- und Datumsattribute hinzu.
|
Element authorElement=articleElement.addElement("author"); |
Element titleElement=articleElement.addElement("title");
|
Element firstNameElement=authorElement.addElement("firstname"); firstNameElement.setText("Marcello"); |
Verwenden Sie die setText()-Methode, um den Text des Artikelelements festzulegen.
titleElement.setText("Java-Konfiguration mit XML-Schema"); |
Element lastNameElement=authorElement.addElement("lastname"); lastNameElement.setText("Vitaletti"); |
Element authorElement=articleElement.addElement("author"); |
Element firstNameElement=authorElement.addElement("firstname");firstNameElement.setText("Marcello"); |
Element lastNameElement=authorElement.addElement("lastname");lastNameElement.setText("Vitaletti"); |
可以使用 addDocType()方法添加文档类型说明。
document.addDocType("catalog", null,"file://c:/Dtds/catalog.dtd"); |
这样就向 XML 文档中增加文档类型说明:
如果文档要使用文档类型定义(DTD)文档验证则必须有 Doctype。
XML 声明 自动添加到 XML 文档中。
清单 3 所示的例子程序 XmlDom4J.java 用于创建 XML 文档 catalog.xml。
清单 3. 生成 XML 文档 catalog.xml 的程序(XmlDom4J.java)
import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.XMLWriter;import java.io.*;public class XmlDom4J{public void generateDocument(){ Document document = DocumentHelper.createDocument(); Element catalogElement = document.addElement("catalog"); catalogElement.addComment("An XML Catalog"); catalogElement.addProcessingInstruction("target","text"); Element journalElement = catalogElement.addElement("journal"); journalElement.addAttribute("title", "XML Zone"); journalElement.addAttribute("publisher", "IBM developerWorks"); Element articleElement=journalElement.addElement("article"); articleElement.addAttribute("level", "Intermediate"); articleElement.addAttribute("date", "December-2001"); Element titleElement=articleElement.addElement("title"); titleElement.setText("Java configuration with XML Schema"); Element authorElement=articleElement.addElement("author"); Element firstNameElement=authorElement.addElement("firstname"); firstNameElement.setText("Marcello"); Element lastNameElement=authorElement.addElement("lastname"); lastNameElement.setText("Vitaletti"); document.addDocType("catalog",null,"file://c:/Dtds/catalog.dtd");try{ XMLWriter output = new XMLWriter( new FileWriter(new File("c:/catalog/catalog.xml"))); output.write( document ); output.close(); } catch(IOException e){ System.out.println(e.getMessage()); } }public static void main(String[] argv){ XmlDom4J dom4j=new XmlDom4J(); dom4j.generateDocument(); } }
这一节讨论了创建 XML 文档的过程,下一节将介绍使用 dom4j API 修改这里创建的 XML 文档。
修改文档
这一节说明如何使用 dom4j API 修改示例 XML 文档 catalog.xml。
使用 SAXReader 解析 XML 文档 catalog.xml:
SAXReader saxReader = new SAXReader(); Document document = saxReader.read(inputXml);
SAXReader 包含在 org.dom4j.io 包中。
inputXml 是从 c:/catalog/catalog.xml 创建的 java.io.File。使用 XPath 表达式从 article 元素中获得 level 节点列表。如果 level 属性值是“Intermediate”则改为“Introductory”。
List list = document.selectNodes("//article/@level" ); Iterator iter=list.iterator(); while(iter.hasNext()){ Attribute attribute=(Attribute)iter.next(); if(attribute.getValue().equals("Intermediate")) attribute.setValue("Introductory"); }
获取 article 元素列表,从 article 元素中的 title 元素得到一个迭代器,并修改 title 元素的文本。
list = document.selectNodes("//article" ); iter=list.iterator(); while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("title"); while(iterator.hasNext()){ Element titleElement=(Element)iterator.next(); if(titleElement.getText().equals("Java configuration with XML Schema")) titleElement.setText("Create flexible and extensible XML schema"); } }
通过和 title 元素类似的过程修改 author 元素。
清单 4 所示的示例程序 Dom4JParser.java 用于把 catalog.xml 文档修改成 catalog-modified.xml 文档。
清单 4. 用于修改 catalog.xml 的程序(Dom4Jparser.java)
import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.Attribute;import java.util.List;import java.util.Iterator;import org.dom4j.io.XMLWriter;import java.io.*;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;public class Dom4JParser{public void modifyDocument(File inputXml){try{ SAXReader saxReader = new SAXReader(); Document document = saxReader.read(inputXml); List list = document.selectNodes("//article/@level" ); Iterator iter=list.iterator();while(iter.hasNext()){ Attribute attribute=(Attribute)iter.next();if(attribute.getValue().equals("Intermediate")) attribute.setValue("Introductory"); } list = document.selectNodes("//article/@date" ); iter=list.iterator();while(iter.hasNext()){ Attribute attribute=(Attribute)iter.next();if(attribute.getValue().equals("December-2001")) attribute.setValue("October-2002"); } list = document.selectNodes("//article" ); iter=list.iterator();while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("title");while(iterator.hasNext()){ Element titleElement=(Element)iterator.next();if(titleElement.getText().equals("Java configuration with XMLSchema")) titleElement.setText("Create flexible and extensible XML schema"); } } list = document.selectNodes("//article/author" ); iter=list.iterator();while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("firstname");while(iterator.hasNext()){ Element firstNameElement=(Element)iterator.next();if(firstNameElement.getText().equals("Marcello")) firstNameElement.setText("Ayesha"); } } list = document.selectNodes("//article/author" ); iter=list.iterator();while(iter.hasNext()){ Element element=(Element)iter.next(); Iterator iterator=element.elementIterator("lastname");while(iterator.hasNext()){ Element lastNameElement=(Element)iterator.next();if(lastNameElement.getText().equals("Vitaletti")) lastNameElement.setText("Malik"); } } XMLWriter output = new XMLWriter(new FileWriter( new File("c:/catalog/catalog-modified.xml") )); output.write( document ); output.close(); } catch(DocumentException e) { System.out.println(e.getMessage()); } catch(IOException e){ System.out.println(e.getMessage()); } }public static void main(String[] argv){ Dom4JParser dom4jParser=new Dom4JParser(); dom4jParser.modifyDocument(new File("c:/catalog/catalog.xml")); } }
结束语:包含在 dom4j 中的解析器是一种用于解析 XML 文档的非验证性工具,可以与JAXP、Crimson 或 Xerces 集成。本文说明了如何使用该解析器创建和修改 XML 文档。
Das obige ist der detaillierte Inhalt vonVier Möglichkeiten zum Parsen von XML. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!