Java で XML を解析するいくつかの方法の概要
最初の方法: DOM。
DOM の正式名は Document Object Model で、ドキュメント オブジェクト モデルでもあります。アプリケーションでは、DOM ベースの XML パーサーが XML ドキュメントをオブジェクト モデルのコレクション (通常は DOM ツリーと呼ばれます) に変換します。アプリケーションは、このオブジェクト モデルの操作を通じて XML ドキュメント データに対する操作を実装します。 DOM インターフェイスを介して、アプリケーションはいつでも XML ドキュメント内のデータの任意の部分にアクセスできるため、DOM インターフェイスを使用したこのメカニズムはランダム アクセス メカニズムとも呼ばれます。
DOM インターフェイスは、階層オブジェクト モデルを通じて XML ドキュメント情報にアクセスする方法を提供します。これらの階層オブジェクト モデルは、XML ドキュメント構造に基づいてノード ツリーを形成します。 XML 文書に記述される情報が表データ、項目リスト、文書など、どのような種類であっても、DOM を使用して生成されるモデルはノード ツリーの形式になります。つまり、DOM では、XML ドキュメント内の情報にアクセスするためにツリー モデルの使用が強制されます。 XML は本質的に階層構造であるため、この記述方法は非常に有効です。
DOM ツリーによって提供されるランダム アクセス方式は、アプリケーション開発に大きな柔軟性をもたらし、XML ドキュメント全体のコンテンツを任意に制御できます。ただし、DOM パーサーは XML ドキュメント全体を DOM ツリーに変換してメモリに格納するため、ドキュメントが大きい場合や構造が複雑な場合、メモリ要件が比較的高くなります。さらに、複雑な構造を持つツリーを走査することも時間のかかる操作です。したがって、DOM アナライザーにはマシンのパフォーマンスに対する要求が比較的高く、実装効率はあまり理想的ではありません。しかし、DOM アナライザのツリー構造の考え方は XML 文書の構造と一致しており、ランダムアクセスによる利便性を考慮すると、DOM アナライザは依然として幅広い利用価値を持っています。
import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class DomTest1 { public static void main(String[] args) throws Exception { // step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器) DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // System.out.println("class name: " + dbf.getClass().getName()); // step 2:获得具体的dom解析器 DocumentBuilder db = dbf.newDocumentBuilder(); // System.out.println("class name: " + db.getClass().getName()); // step3: 解析一个xml文档,获得Document对象(根结点) Document document = db.parse(new File("candidate.xml")); NodeList list = document.getElementsByTagName("PERSON"); for(int i = 0; i < list.getLength(); i++) { Element element = (Element)list.item(i); String content = element.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue(); System.out.println("name:" + content); content = element.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue(); System.out.println("address:" + content); content = element.getElementsByTagName("TEL").item(0).getFirstChild().getNodeValue(); System.out.println("tel:" + content); content = element.getElementsByTagName("FAX").item(0).getFirstChild().getNodeValue(); System.out.println("fax:" + content); content = element.getElementsByTagName("EMAIL").item(0).getFirstChild().getNodeValue(); System.out.println("email:" + content); System.out.println("--------------------------------------"); } } }
import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Attr; import org.w3c.dom.Comment; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * 使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上 * @author zhanglong * */ public class DomTest3 { public static void main(String[] args) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File("student.xml")); //获得根元素结点 Element root = doc.getDocumentElement(); parseElement(root); } private static void parseElement(Element element) { String tagName = element.getNodeName(); NodeList children = element.getChildNodes(); System.out.print("<" + tagName); //element元素的所有属性所构成的NamedNodeMap对象,需要对其进行判断 NamedNodeMap map = element.getAttributes(); //如果该元素存在属性 if(null != map) { for(int i = 0; i < map.getLength(); i++) { //获得该元素的每一个属性 Attr attr = (Attr)map.item(i); String attrName = attr.getName(); String attrValue = attr.getValue(); System.out.print(" " + attrName + "=\"" + attrValue + "\""); } } System.out.print(">"); for(int i = 0; i < children.getLength(); i++) { Node node = children.item(i); //获得结点的类型 short nodeType = node.getNodeType(); if(nodeType == Node.ELEMENT_NODE) { //是元素,继续递归 parseElement((Element)node); } else if(nodeType == Node.TEXT_NODE) { //递归出口 System.out.print(node.getNodeValue()); } else if(nodeType == Node.COMMENT_NODE) { System.out.print("<!--"); Comment comment = (Comment)node; //注释内容 String data = comment.getData(); System.out.print(data); System.out.print("-->"); } } System.out.print("</" + tagName + ">"); } }
sax: SAX の正式名は Simple APIs for XML で、XML のシンプルなアプリケーション プログラミング インターフェイスです。 DOM とは異なり、SAX が提供するアクセス モードはシーケンシャル モードであり、XML データの読み取りと書き込みを高速に行う方法です。 SAX パーサーを使用して XML ドキュメントを分析すると、一連のイベントがトリガーされ、アプリケーションはこれらのイベント処理関数を使用して XML ドキュメントにアクセスします。そのため、SAX インターフェイスも呼び出されます。イベント駆動型のインターフェース。
import java.io.File; 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; public class SaxTest1 { public static void main(String[] args) throws Exception { //step1: 获得SAX解析器工厂实例 SAXParserFactory factory = SAXParserFactory.newInstance(); //step2: 获得SAX解析器实例 SAXParser parser = factory.newSAXParser(); //step3: 开始进行解析 parser.parse(new File("student.xml"), new MyHandler()); } } class MyHandler extends DefaultHandler { @Override public void startDocument() throws SAXException { System.out.println("parse began"); } @Override public void endDocument() throws SAXException { System.out.println("parse finished"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("start element"); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("finish element"); } }errree
JDOM:
JDOM はオープンソース プロジェクトであり、ツリー構造に基づいており、純粋な JAVA テクノロジを使用して XML ドキュメントの解析、生成、シリアル化、さまざまな操作を実行します。 (http://jdom.org)
•JDOM は Java プログラミングを直接提供します。より強力な JAVA 言語の多くの機能 (メソッドのオーバーロード、コレクションの概念など) を使用して、SAX と DOM の機能を効果的に組み合わせます。
•JDOM は、Java 言語で XML を読み取り、書き込み、操作するための新しい API 関数です。これらの API 関数は、直接的、シンプル、効率的であることを前提として、最大限に最適化されています。
jdom は xml を作成します
import java.io.File; import java.util.Stack; 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; public class SaxTest2 { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(new File("student.xml"), new MyHandler2()); } } class MyHandler2 extends DefaultHandler { private Stack<String> stack = new Stack<String>(); private String name; private String gender; private String age; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { stack.push(qName); for(int i = 0; i < attributes.getLength(); i++) { String attrName = attributes.getQName(i); String attrValue = attributes.getValue(i); System.out.println(attrName + "=" + attrValue); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String tag = stack.peek(); if("姓名".equals(tag)) { name = new String(ch, start,length); } else if("性别".equals(tag)) { gender = new String(ch, start, length); } else if("年龄".equals(tag)) { age = new String(ch, start, length); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { stack.pop(); //表示该元素已经解析完毕,需要从栈中弹出 if("学生".equals(qName)) { System.out.println("姓名:" + name); System.out.println("性别:" + gender); System.out.println("年龄:" + age); System.out.println(); } } }
JDOM は xml を解析します
import java.io.FileWriter; import org.jdom.Attribute; import org.jdom.Comment; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; public class JDomTest1 { public static void main(String[] args) throws Exception { Document document = new Document(); Element root = new Element("root"); document.addContent(root); Comment comment = new Comment("This is my comments"); root.addContent(comment); Element e = new Element("hello"); e.setAttribute("sohu", "www.sohu.com"); root.addContent(e); Element e2 = new Element("world"); Attribute attr = new Attribute("test", "hehe"); e2.setAttribute(attr); e.addContent(e2); e2.addContent(new Element("aaa").setAttribute("a", "b") .setAttribute("x", "y").setAttribute("gg", "hh").setText("text content")); Format format = Format.getPrettyFormat(); format.setIndent(" "); // format.setEncoding("gbk"); XMLOutputter out = new XMLOutputter(format); out.output(document, new FileWriter("jdom.xml")); } }
Dom4j
import java.io.File; import java.io.FileOutputStream; import java.util.List; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; public class JDomTest2 { public static void main(String[] args) throws Exception { SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new File("jdom.xml")); Element element = doc.getRootElement(); System.out.println(element.getName()); Element hello = element.getChild("hello"); System.out.println(hello.getText()); List list = hello.getAttributes(); for(int i = 0 ;i < list.size(); i++) { Attribute attr = (Attribute)list.get(i); String attrName = attr.getName(); String attrValue = attr.getValue(); System.out.println(attrName + "=" + attrValue); } hello.removeChild("world"); XMLOutputter out = new XMLOutputter(Format.getPrettyFormat().setIndent(" ")); out.output(doc, new FileOutputStream("jdom2.xml")); } }
import java.io.FileOutputStream; import java.io.FileWriter; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class Test1 { public static void main(String[] args) throws Exception { // 创建文档并设置文档的根元素节点 :第一种方式 // Document document = DocumentHelper.createDocument(); // // Element root = DocumentHelper.createElement("student"); // // document.setRootElement(root); // 创建文档并设置文档的根元素节点 :第二种方式 Element root = DocumentHelper.createElement("student"); Document document = DocumentHelper.createDocument(root); root.addAttribute("name", "zhangsan"); Element helloElement = root.addElement("hello"); Element worldElement = root.addElement("world"); helloElement.setText("hello"); worldElement.setText("world"); helloElement.addAttribute("age", "20"); XMLWriter xmlWriter = new XMLWriter(); xmlWriter.write(document); OutputFormat format = new OutputFormat(" ", true); XMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("student2.xml"), format); xmlWriter2.write(document); XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("student3.xml"), format); xmlWriter3.write(document); xmlWriter3.close(); } }
import java.io.File; import java.util.Iterator; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.DOMReader; import org.dom4j.io.SAXReader; public class Test2 { public static void main(String[] args) throws Exception { SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(new File("student2.xml")); Element root = doc.getRootElement(); System.out.println("root element: " + root.getName()); List childList = root.elements(); System.out.println(childList.size()); List childList2 = root.elements("hello"); System.out.println(childList2.size()); Element first = root.element("hello"); System.out.println(first.attributeValue("age")); for(Iterator iter = root.elementIterator(); iter.hasNext();) { Element e = (Element)iter.next(); System.out.println(e.attributeValue("age")); } System.out.println("---------------------------"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); org.w3c.dom.Document document = db.parse(new File("student2.xml")); DOMReader domReader = new DOMReader(); //将JAXP的Document转换为dom4j的Document Document d = domReader.read(document); Element rootElement = d.getRootElement(); System.out.println(rootElement.getName()); } }
Java で XML を解析するいくつかの方法の概要と関連記事については、PHP 中国語 Web サイトに注目してください。