昨天我們做了XML文件的內容解析,但我們有時候和服務器交互的時候需要生成json(講解完XML後就講解json的解析和生成)或者XML格式的數據。於是就有了生成XML格式數據的需求。
生成XML數據有很多種方式,最笨的方法就是一個一個去拼接,然後通過IO流寫入文件,當然這非常的麻煩。因爲博主搞的是安卓開發,常用的就是Android自帶的XmlSerializer來生成XML文件內容。
形成的參考文件和昨天內容一樣:
<?xml version='1.0' encoding='UTF-8' ?>
<菜系>
<span style="white-space:pre"> </span><菜 id="1">
<span style="white-space:pre"> </span><菜名>飯炒蛋</菜名>
<span style="white-space:pre"> </span><圖片路徑>d:\pic</圖片路徑>
<span style="white-space:pre"> </span> <售價>10.0元</售價>
<span style="white-space:pre"> </span></菜>
<span style="white-space:pre"> </span><菜 id="2">
<span style="white-space:pre"> </span><菜名>蛋炒飯</菜名>
<span style="white-space:pre"> </span><圖片路徑>d:\pic</圖片路徑>
<span style="white-space:pre"> </span><售價>10.0元</售價>
<span style="white-space:pre"> </span>></菜>
</菜系>
首先,一般來說,XML數據格式包括一個標籤名和標籤值,所以博主定義了一個product類(這裏只做最底層的標籤,只用作參考說明,在實際開發中可以將所有標籤都做成一個類,便於管理,也使代碼能夠整潔規範。在這裏也沒有加入attribute,有興趣的同學可以將這個類做的更完善,加入attribute屬性值)
public class Product {
private String tagName;
private String tagValue;
public Product(String tagName, String tagValue) {
super();
this.tagName = tagName;
this.tagValue = tagValue;
}
public Product(String tagName) {
super();
this.tagName = tagName;
}
public String getTagValue() {
return tagValue;
}
public void setTagValue(String tagValue) {
this.tagValue = tagValue;
}
public String getTagName() {
return tagName;
}
/**
* 序列化節點
*
* @param serializer
*/
public void serializerLeaf(XmlSerializer serializer) {
try {
serializer.startTag(null, tagName);
if (StringUtils.isBlank(tagValue)) {
tagValue = "";
}
serializer.text(tagValue);
serializer.endTag(null, tagName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
接下來是生成XML數據代碼
1、生成所有子節點
private void serizlizerProductCategory(XmlSerializer serializer)
throws IOException {
for (int i = 1; i <= 2; i++) {
serializer.startTag(null, "菜");
serializer.attribute("", "id", i + "");
// leaf
if (i == 1) {
Product product = new Product("菜名", "飯炒蛋");
Product product1 = new Product("圖片路徑", "d:\\pic");
Product product2 = new Product("售價", "10.0元");
product.serializerLeaf(serializer);
product1.serializerLeaf(serializer);
product2.serializerLeaf(serializer);
} else if (i == 2) {
Product product = new Product("菜名", "蛋炒飯");
Product product1 = new Product("圖片路徑", "d:\\pic");
Product product2 = new Product("售價", "10.0元");
product.serializerLeaf(serializer);
product1.serializerLeaf(serializer);
product2.serializerLeaf(serializer);
}
serializer.endTag(null, "菜");
}
}
2、生成根節點及整個文件內容
public void creatProductXml() {
XmlSerializer serializer = Xml.newSerializer();
try {
StringWriter writer = new StringWriter();
serializer.setOutput(writer);
/**
* 這個方法必須在setOutput之後。
*/
serializer.startDocument("UTF-8", null);
serializer.startTag(null, "菜系");
serizlizerProductCategory(serializer);
serializer.endTag(null, "菜系");
serializer.endDocument();
System.out.println(writer.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
最後從logcat中可以看到打印出來的內容和上面的XML文檔內容一樣。至此,只需要通過IO生成一個.xml文件,將內容寫進去即可。文件IO流的讀寫在後續的文章會再詳細講到,這裏不再描述。