项目需要生成xml,样式较为复杂,几经曲折终于搞定,生成xml的样式如下:
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<root xmlns="china">
... ...
<BodyList xmlns:sax="male" xml:name="chinese">
<Body>
<sax:xxid>中年男性</sax:xxid>
<name:xxname>尼大叔</name:xxname>
</Body>
<Body>
... ...
</Body>
</BodyList>
... ...
</root>
看上的xml中xmlns就是属于tag的属性,而sax则属于一个命名空间,这是个什么东西呢
言而总之就是说xxid引用的是xmlns:sax的值,此处代表性别男性,而他自己可以是中年男性,也可以是小男孩,也可以是青年或老年人等
我的理解命名空间 类似与java的包的概念
实现代码如下
public String createXml() {
XmlSerializer xmlSerializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
xmlSerializer.setOutput(writer);
xmlSerializer.startDocument("UTF-8", true);
/**
* 此处生成的是<root xmlns="china">
*/
xmlSerializer.startTag("", "root");
xmlSerializer.attribute("", "xmlns", "china");
// ... ...
/**
* 这里会生成命名空间,命名空间和属性从表面看最大区别就是:
* 声明的时候(应该说赋值的时候),一个带前缀,一个不带前缀
*/
xmlSerializer.setPrefix("sax", "max");
xmlSerializer.setPrefix("name", "chinese");
xmlSerializer.startTag("", "BodyList");
xmlSerializer.startTag("", "Body");
/**
* 对于命名空间值的运用,把starttag的namespace参数添加上去相应的即可
* public abstract XmlSerializer startTag (String namespace, String name)
*/
xmlSerializer.startTag("sax", "xxid");
xmlSerializer.text("中年大叔");
xmlSerializer.endTag("sax", "xxid");
/**
* 如果此处设置前缀的话(即调用方法setPrefix)就会生成错误的结果
*/
xmlSerializer.startTag("name", "xxname");
xmlSerializer.text("尼大叔"); //这个是中间的文字
xmlSerializer.endTag("name", "xxname");
xmlSerializer.endTag("", "Body");
xmlSerializer.endTag("", "BodyList");
// ... ...
// 文档结束
xmlSerializer.endTag("", "root");
xmlSerializer.endDocument();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String resultString = writer.toString();
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return resultString;
}