ちょっと生きづらさを抱えた人へ、気持ちを楽にするためのお手紙です。

【Java】String型でXMLを扱う

どうしたわけか、文字列でXMLを扱う必要がありまして、
取りあえず書いてみた。
細かい説明は後日。

こんなXMLを作ってパース。

<root>
<devil>
<misician no="0">小暮伝衛門</misician>
<album no="0">好色萬声男</album>
</devil>
<devil>
<misician no="1">CANTA</misician>
<album no="1">流星と春の嵐</album>
</devil>
</root>
package com.fudebaco.util;

import com.fudebaco.bean.SampleXmlBean;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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;

public class XmlSample {

	public static void main(String args[]){
        List<SampleXmlBean> list = createSampleList();
        
        String xml = createStringXml(list);
        
        try {
            parseXml(xml);
        } catch (Exception ex) {
            Logger.getLogger(XmlSample.class.getName()).log(Level.SEVERE, null, ex);
        }
	}
    
    private static String createStringXml(List<SampleXmlBean> list) {
        String xml = "";
        try {
			DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
			Document document = docbuilder.newDocument();

            // ノード生成
            Element root = document.createElement("root");
            // ノードをDocumentに追加
            document.appendChild(root);
            
            for (int i = 0; i < list.size(); i++) {
                SampleXmlBean bean = list.get(i);

                Element sep = document.createElement("devil");
                root.appendChild(sep);
                
                Element elem1 = document.createElement("misician");
                elem1.setTextContent(bean.getElem1());
                elem1.setAttribute("no", Integer.toString(i));
                sep.appendChild(elem1);
                
                Element elem2 = document.createElement("album");
                elem2.setTextContent(bean.getElem2());
                elem2.setAttribute("no", Integer.toString(i));
                sep.appendChild(elem2);
            }
			/*
		     * DOMオブジェクトを文字列として出力
		     */
            StringWriter sw = new StringWriter();
		    TransformerFactory tfactory = TransformerFactory.newInstance();
		    Transformer transformer = tfactory.newTransformer();
            transformer.setOutputProperty("method", "html"); // 宣言を出さない
//		    transformer.transform(new DOMSource(document), new StreamResult(System.out));
            transformer.transform(new DOMSource(document), new StreamResult(sw));
            xml = sw.toString();
		} catch (Exception e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
        return xml;
    }
    
        private static void parseXml(String xml) throws Exception {
        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
        
        // Document document = documentBuilder.parse(file);
        Document document = docbuilder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
        
        // ルートの要素を取得
        Element root = document.getDocumentElement();
        System.out.println("ルート:" + root.getNodeName());
        
        //ルートの子ノードを取得
		NodeList rootChildren = root.getChildNodes();
        
        for(int i=0; i < rootChildren.getLength(); i++) {
            Node node = rootChildren.item(i);
            
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element)node;
                if (element.getNodeName().equals("devil")) {
                    NodeList devilChildren = node.getChildNodes();
                    for (int j=0; j < devilChildren.getLength(); j++) {
                        Node devilNode = devilChildren.item(j);
                        if (devilNode.getNodeType() == Node.ELEMENT_NODE) {
                            if (devilNode.getNodeName().equals("misician")) {
                                System.out.println("misician:" + devilNode.getTextContent());
                            }
                        }
                    }
                }
            }
        }
    }

    private static List<SampleXmlBean> createSampleList() {
        List<SampleXmlBean> list = new ArrayList<>();
        
        SampleXmlBean bean1 = new SampleXmlBean();
        bean1.setElem1("小暮伝衛門");
        bean1.setElem2("好色萬声男");
        
        list.add(bean1);
        
        SampleXmlBean bean2 = new SampleXmlBean();
        bean2.setElem1("CANTA");
        bean2.setElem2("流星と春の嵐");
        
        list.add(bean2);
        
        return list;
    }
}

参考にさせていただいたサイト

[blogcard url=”http://www.atmarkit.co.jp/ait/articles/0102/10/news003_3.html″] [blogcard url=”http://code-examples-ja.hateblo.jp/entry/2014/08/08/Java_XML%E3%82%92DOM%E3%81%A7%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E5%86%85%E5%AE%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B″]

コメントを残す

メールアドレスが公開されることはありません。