java處理xml——Dom方式

字符串格式的xml

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Java Tutorials and Examples</title><item><title><![CDATA[Java Tutorials]]></title><link>http://www.javacodegeeks.com/</link></item><item><title><![CDATA[Java Examples]]></title><link>http://examples.javacodegeeks.com/</link></item></channel><channel></channel></rss>

格式化的xml

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Java Tutorials and Examples</title>
		<item>
			<title>
				<![CDATA[Java Tutorials]]>
			</title>
			<link>http://www.javacodegeeks.com/</link>
		</item>
		<item>
			<title>
				<![CDATA[Java Examples]]>
			</title>
			<link>http://examples.javacodegeeks.com/</link>
		</item>
	</channel>
	<channel></channel>
</rss>

完整代碼:

import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;

/**
 * @Author Daniel
 * @Description java自帶的類解析xml文件的常用API
 **/
public class DomAPI {
    static Document doc = null;
    static Element element = null;

    public static void main(String[] args) throws Exception {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><rss version=\"2.0\"><channel><title>Java Tutorials and Examples</title><item><title><![CDATA[Java Tutorials]]></title><link>http://www.javacodegeeks.com/</link></item><item><title><![CDATA[Java Examples]]></title><link>http://examples.javacodegeeks.com/</link></item></channel><channel></channel></rss>";
        //建立一個解析器工廠
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //利用這個工廠來獲得一個具體的解析器對象
        DocumentBuilder db = dbf.newDocumentBuilder();
        //傳入解析類型,這裏爲字符串,如要傳文件則是ocument doc=builder.parse(“data.xml")
        doc = db.parse(new ByteArrayInputStream(xml.getBytes(Charset.defaultCharset())));
        //獲取第一個channel的Element對象
        element = (Element) doc.getElementsByTagName("channel").item(0);
        create();
//        update();
//        retrieve();
//        delete();
    }

    public static void create() {
        //創建一個新的標籤
        Element newElement = doc.createElement("Price");
        //設置標籤的內容
        newElement.setTextContent("$50.00");
        //將此標籤添加到channel下面
        element.appendChild(newElement);
        //創建一個空的屬性名
        Attr nullAttribute = doc.createAttribute("id");
        //爲當前的element加上屬性
        element.setAttributeNode(nullAttribute);
        //上面兩句代碼的效果等同於element.setAttribute("id","")
        System.out.println(getResult(doc));
    }

    public static void update() {

        //設置channel的屬性與屬性值
        element.setAttribute("Type", "myAttribute");
        System.out.println(getResult(doc));
    }

    public static void retrieve() {
        //得到某個標籤的個數
        int channelCount = doc.getElementsByTagName("channel").getLength();//2
        //獲取到第一個channel中的第一個item中第一個title的文本值
        String text = ((Element) (((Element) (doc.getElementsByTagName("channel").item(0))).getElementsByTagName("item").item(0))).getElementsByTagName("title").item(0).getTextContent();
        //判斷第二個channel是否爲單標籤
        boolean flag = doc.getElementsByTagName("channel").item(1).getTextContent() == "" ? true : false;
        //整個xml的根節點的Element對象
        Element documentElement = doc.getDocumentElement();
        //獲取元素名
        String tagName = element.getTagName();
        //獲取channel中屬性Type的值
        String value = ((Element) doc.getElementsByTagName("rss").item(0)).getAttribute("version");
        System.out.println("channel的個數:" + channelCount + "\ntitle的內容:" + text + "\n是否爲單標籤:" + flag + "\n該文件的根節點爲:" + documentElement.getTagName() + "\n當前Element的標籤爲:" + tagName + "\n屬性值爲:" + value);
    }

    public static void delete() {
        //刪除第一個channel中的第一個item標籤以及它的子標籤
        element.removeChild(((Element) (doc.getElementsByTagName("channel").item(0))).getElementsByTagName("item").item(0));
        System.out.println(getResult(doc));
    }

    //將xml轉換成字符串
    public static String getResult(Document xml) {
        Transformer tf = null;
        try {
            tf = TransformerFactory.newInstance().newTransformer();
            tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            Writer out = new StringWriter();
            tf.transform(new DOMSource(xml), new StreamResult(out));
            //刪除第一行的註釋標籤
            return out.toString().substring(out.toString().indexOf(">") + 1);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
        return "ERROR!";
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章