字符串格式的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!";
}
}