が付いているのでとても便利です。 XML 自体の文法知識と技術的な詳細については、DOM (Document Object Model)、DTD (Document Type Definition)、SAX (Simple API for XML)、XSD (Xml Schema Definition) などの関連技術文献を読む必要があります。 、XSLT (Extensible Stylesheet Language Transformations) の詳細については、w3c 公式 Web サイトのドキュメントを参照してください。
XMLは異なる言語でも同じ方法で解析されますが、実装される構文は異なります。基本的な解析方法は 2 つあり、1 つは SAX と呼ばれ、もう 1 つは DOM と呼ばれます。 SAX はイベント ストリームの解析に基づいており、DOM は XML ドキュメントのツリー構造の解析に基づいています。 XML の内容と構造は次のとおりであると仮定します。
<?xml version="1.0" encoding="UTF-8"?><employees><employee> <name>ddviplinux</name> <sex>m</sex> <age>30</age></employee></employees>
この記事では、JAVA 言語を使用して DOM と SAX の XML ドキュメントを生成および解析します。
まずXML文書を操作するためのインターフェースXmlDocumentを定義しますXML文書を作成・解析するためのインターフェースを定義します。
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ドキュメントの生成と解析
XMLドキュメントの解析されたバージョンのインターフェースのセットを定義します。パーサーはドキュメント全体を読み取り、コードが DOM インターフェイスを使用して操作できるメモリ常駐ツリー構造を構築します。
利点: ドキュメントツリー全体がメモリ内にあるため、操作が簡単です。削除、変更、再配置などの機能をサポートしています。
欠点: ドキュメント全体をメモリに転送すると、時間とスペースが無駄になります。
使用状況: ドキュメントが解析されると、データに複数回アクセスする必要がありますが、ハードウェア リソース (メモリ、CPU) は十分です。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文書の生成と解析
優れたパフォーマンス、強力な機能、そして非常に使いやすいという特別な機能を備えたオープンソース ソフトウェアでもあります。最近では、XML の読み書きに DOM4J を使用する Java ソフトウェアが増えています。特に、Sun の JAXM も DOM4J を使用していることは注目に値します。
import 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)); } }
4. JDOMXMLの生成と解析 DOMとSAXのコーディング量を削減するために、JDOMが登場しました; 利点: 20-80原則により、コードの量が大幅に削減されます。
import 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"); } }
5. dom4jを使用してXMLを解析します
dom4j APIには、XMLドキュメントを解析するためのツールが含まれています。この記事では、このパーサーを使用してサンプル XML ドキュメントを作成します。
XML の例 ドキュメント (catalog. .xml.
リスト 2.
)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();
}
}
}
W3C DOM API と比較して、dom4j に含まれるパーサーを使用する利点は、dom4j がローカルなXPath のサポート。 DOM パーサーは、XPath を使用したノード選択をサポートしていません。 この記事には次の部分が含まれています:
Presets
Create document
Modify document
Presets
このパーサーは から入手できます。クラスパス上で dom4j-1.4/dom4j-full.jar にアクセスできるようにします。これには、dom4j クラス、XPath エンジン、SAX および DOM インターフェイスが含まれます。 JAXP パーサーに含まれる SAX および DOM インターフェースをすでに使用している場合は、クラスパスに dom4j-1.4/dom4j.jar を追加します。 dom4j.jar には、dom4j クラスと XPath エンジンが含まれていますが、SAX インターフェイスと DOM インターフェイスは含まれていません。
ドキュメントの作成
このセクションでは、dom4j API を使用して XML ドキュメントを作成するプロセスについて説明し、サンプル XML ドキュメント category.xml を作成します。
import ステートメントを使用して、dom4j API クラスをインポートします:
import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; |
DocumentHelperクラスを使ってドキュメントインスタンスを作成します。 DocumentHelper は、XML ドキュメント ノードを生成する dom4j API ファクトリ クラスです。 addElement() メソッドを使用して、ルート要素カタログを作成します。 addElement() は、XML ドキュメントに要素を追加するために使用されます。
Element galleryElement = document.addElement("catalog"); |
addComment() メソッドを使用して、カタログ要素にコメント「XML カタログ」を追加します。
catalogElement.addComment ("XML カタログ");カタログ要素で addElement() メソッドを使用して、ジャーナル要素を追加します。 addAttribute() メソッドを使用して、タイトルと発行者の属性をジャーナル要素に追加します。 |
journalElement.addAttribute("title", "XML Zone");
article要素にjournal要素を追加します。記事要素にレベル属性と日付属性を追加します。
articleElement.addAttribute("level", "Intermediate"); | articleElement.addAttribute("date", " December-2001");
Element lastNameElement=authorElement.addElement("lastname"); |
可以使用 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 文档。 以上がXMLを解析する4つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。 声明: この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。 |