ファイル処理のXML----DOM方式
XML解析のいくつかの方法については、他人のブログを見に行くことができます。ここでは主にDOM、SAX、DOM M 4 Jの3つの方法でxmlを生成し、xmlを解析する例を示しています。4種類のXMLドキュメントの生成と解析方法の詳細(紹介+長所と短所の比較+例)
DOM方式でxmlを生成します。
DOM方式解析xml:
SAX方式でXMLを生成する
SAX方式解析XML
メーン関数
DOM 4 J方式でXMLドキュメントを作成します。
DOM 4 J方式解析XMLドキュメント
DOM方式でxmlを生成します。
public static void DomCreateXml() throws Exception {
// 1、 DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2、 DocumentBuilder
DocumentBuilder db = dbf.newDocumentBuilder();
// 3、 Document
Document document = db.newDocument();
//
Element songs = document.createElement("songs");
// ( )
for (int i = 0; i < 5; i++) {
//
Element song = document.createElement("song");
Element name = document.createElement("name");
// name
//
name.setTextContent(" ");
Element time = document.createElement("time");
time.setTextContent("5:20");
Element size = document.createElement("size");
size.setTextContent("30m");
//
song.appendChild(name);
song.appendChild(time);
song.appendChild(size);
songs.appendChild(song);
}
//
document.appendChild(songs);
// demo/
// TransformerFactory
TransformerFactory tff = TransformerFactory.newInstance();
// tff Transformer
Transformer tf = tff.newTransformer();
// xml
tf.setOutputProperty(OutputKeys.INDENT, "yes");
// xml
tf.transform(new DOMSource(document), new StreamResult("demo/dom.xml"));
}
DOMを使用してxmlを作成する時はDOM数の階層関係に注意しなければなりません。DOMはw 3 cの標準ですので、DOMは一定の汎用性を持っています。JavaScriptで動作します。上のコードと似ています。ここでは説明しないです。次にもう一度見てみましょう。DOM方式解析xml:
public static void DomParseXml() throws Exception {
// 1、 DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2、 DocumentBuilder
DocumentBuilder db = dbf.newDocumentBuilder();
// 3、 db parse xml
Document parse = db.parse(new FileInputStream("demo/dom.xml"));
// parse , song
NodeList songs = parse.getElementsByTagName("song");
for (int i = 0; i < songs.getLength(); i++) {
// item
Node song = songs.item(i);
// song song
NamedNodeMap attributes = song.getAttributes();
//
System.out.println(attributes.getLength());
//
for (int j = 0; j < attributes.getLength(); j++) {
// song
Node item = attributes.item(j);
//
System.out.println(item.getNodeName() + " = " + item.getNodeValue() + "");
}
//
NodeList childNodes = song.getChildNodes();
//
System.out.println(childNodes.getLength());
//
for (int k = 0; k < childNodes.getLength(); k++) {
//
if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
System.out.println(childNodes.item(k).getNodeName() + " = " + childNodes.item(k).getTextContent());
}
}
}
}
サブノードの値を取得する際には、get NodeVaue()の方法ではなく、get TextContantet()の方法が必要であり、もちろん、child Nodes.item(k).get First Child().get NodeValue()の方法を使用してノード値を取得することもできる。SAX方式でXMLを生成する
public static void SAXCreateXml() throws Exception {
// xml
StreamResult streamResult = new StreamResult(new FileOutputStream("demo/sax.xml"));
// xml xml
// SAXTransformerFactory
SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
// tff TransformerHandler
TransformerHandler handler = tff.newTransformerHandler();
// xml
handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes");
// handler xml
handler.setResult(streamResult);
// xml
// document
handler.startDocument();
//
AttributesImpl attr = new AttributesImpl();
//
handler.startElement("", "", "songs", attr);
for (int i = 0; i < 5; i++) {
// ( )
String s1 = " ",s2="4:30 ",s3="4 M";
//
attr.clear();
attr.addAttribute("", "", "id", "", "1");
handler.startElement("", "", "song", attr);
attr.clear();
handler.startElement("", "", "name", attr);
handler.characters(s1.toCharArray(), 0, s1.length());
handler.endElement("", "", "name");
attr.clear();
handler.startElement("", "", "time", attr);
handler.characters(s2.toCharArray(), 0, s2.length());
handler.endElement("", "", "time");
attr.clear();
handler.startElement("", "", "size", attr);
handler.characters(s3.toCharArray(), 0, s3.length());
handler.endElement("", "", "size");
handler.endElement("", "", "song");
}
//
handler.endElement("", "", "songs");
handler.endDocument();
}
ここで私が使っているのは自分で定義した文字列です。もちろん配列や集合を自分で定義することもできます。集合を定義する時は空かどうか判断して、空のポインタを報告しないでください。SAX方式解析XML
メーン関数
public static ArrayList SAXParseXml() throws Exception {
// 1、 SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2、 factory SAXParser
SAXParser parser = factory.newSAXParser();
// 3、parse parse xml
// DefaultHandler
SAXHandler saxHandler = new SAXHandler();
parser.parse(new FileInputStream("demo/songs.xml"), saxHandler);
// list
System.out.println(saxHandler.getList().size());
List list = saxHandler.getList();
for (Song s : list) {
System.out.println(s.getId());
System.out.println(s.getName());
System.out.println(s.getTime());
System.out.println(s.getSize());
}
return (ArrayList) saxHandler.getList();
}
SAXHandler類:public class SAXHandler extends DefaultHandler {
private List list ;
private Song song = null;
private String string = null;
// getList
public List getList() {
return list;
}
public SAXHandler() {
this.list =new ArrayList();
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println(" ");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
if (qName.equals("song")) {
// song
song = new Song();
// song
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(i) + " = " + attributes.getValue(i));
System.out.println("
==========================");
// id
if (attributes.getQName(i).equals("id")) {
song.setId(attributes.getValue(i));
}
}
} else if (!qName.equals("song") && !qName.equals("songs")) {
System.out.println(" :" + qName);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
// endElement
string = new String(ch, start, length);
//
if (!string.trim().equals("")) {
System.out.println(" :" + string + "
");
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if (qName.equals("song")) {
System.out.println("============= ===============");
//
list.add(song);
// song
song = null;
} else if (qName.equals("name")) {
song.setName(string);
} else if (qName.equals("time")) {
song.setTime(string);
} else if (qName.equals("size")) {
song.setSize(string);
}
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println(" ");
}
}
エンティティクラスSong:package com.entity;
public class Song {
private String id;
private String name;
private String time;
private String size;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
}
上の操作:解析xmlドキュメント->を集合に保存します。出力は集合に保存しないで直接出力してもいいです。直接にエンティティ類と集合に関するコードを削除してもいいです。ただ、私たちは普通に値を保存してから取り出します。ある程度の普遍性を感じますので、集合に保存した例を貼り付けました。SAX方法は実はこの4つの方法の中で解析速度が一番速いです。間違いなく中小型のxmlデータの中ではdom 4 jよりも速いです。大きなデータの中ではdom 4 jが一番いいです。冒頭のブログを見ても分かります。SAXにもいくつかの欠点があります。ここでは詳しく説明しません。DOM 4 J方式でXMLドキュメントを作成します。
public static void DOM4JCreateXML() throws Exception {
//1、 document
Document document = DocumentHelper.createDocument();
//2、
Element rootElement = document.addElement("songs");
//3、
Element song = rootElement.addElement("song");
Element name = song.addElement("name");
name.setText(" ");
Element time = song.addElement("time");
time.setText("5:20");
Element size = song.addElement("size");
size.setText("10M");
//4、 xml
XMLWriter xmlWriter = new XMLWriter(
new FileOutputStream("demo/dom4j.xml"),
//
OutputFormat.createPrettyPrint()
);
//
xmlWriter.write(document);
// xmlWriter
xmlWriter.close();
}
特に要求がないなら、みんなDOM 4 Jを使ったほうがいいと思います。コード量が少なくて、作成したxml文書も美しいです。また、DOM 4 Jは多くの複雑なxml文書をサポートしています。まだ使ったことがありません。知っているなら、私に言ってもいいです。大歓迎です。DOM 4 J方式解析XMLドキュメント
// SAXReader
SAXReader saxReader = new SAXReader();
// books.xml document
Document document = saxReader.read(new InputStreamReader(new FileInputStream("demo/dom4j.xml"), "utf-8"));
// document
Element rootElement = document.getRootElement();
//
Iterator elementIterator = rootElement.elementIterator();
while (elementIterator.hasNext()) {
Element song = (Element) elementIterator.next();
// book
List attributes = song.attributes();
for (Attribute attr : attributes) {
System.out.println(attr.getName()+" = "+attr.getValue());
}
// song
Iterator elementIterator2 = song.elementIterator();
while (elementIterator2.hasNext()) {
Element songChild = (Element) elementIterator2.next();
System.out.println(" :"+songChild.getName()+" "+songChild.getStringValue());
}
}
}
ここではXMLドキュメントを解析するための3つの方法を紹介します。JDOMでは、使用する必要がないと思います。完全にDOM 4 Jで代替できます。また、DOMでは大きなファイルに遭遇してもうまく処理できないので、SAX方式とDOM 4 J方式でXMLドキュメントを解析して生成することをおすすめします。最も重要な点は、もう少しで見落としてしまいました。DOM方式とSAXはJAVAで持参したものです。余分なJARカバンを導入する必要はありません。JDOMとDOM 4は全部追加のJARカバンを導入する必要があります。