XML的读取和解析以及输出
XML的简介
XML即是Extensible Markup Language的缩写,是一种用于标记电子文件使之具有结构性的标记语言。XML是HTML的一个子集,并非是HTML的替代,二者具有相似性和区别。XML可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,具有以下特性:
1. XML类似于HTML。
2. XML适合传输数据而非现实数据。
3. XML的标签需要用户自定义
4. XML是w3c的推荐标准
5. XML具有自我描述性
与HTML的区别:
1. XML不是HTML的替代
2. XML和HTML的设计目的不同,XML注重数据的内容和数据的传输,HTML注重数据的外观和现实数据。
XML的语法结构(摘自百度百科)
一、任何的起始标签都必须有一个结束标签。
二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<百度百科词条/>。XML解析器会将其翻译成<百度百科词条></百度百科词条>。
三、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如这是一串百度百科中的样例字符串。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
四、所有的特性都必须有值。
五、所有的特性都必须在值的周围加上双引号。
XML的实例
<Languages cat="it">
<lan id="1">
<name>java</name>
<ide>eclipse</ide>
</lan>
<lan id="2">
<name>swift</name>
<ide>xcode</ide>
</lan>
<lan id="3">
<name>c#</name>
<ide>vs</ide>
</lan>
</Languages>
在XML中,元素可以包含其他元素,文本内容,或者二者的混合物。元素可以拥有属性
在此例中languages包含了元素和文本,本身也具有属性,lan中也是包含元素,和文本,本身也有属性,而例如name中则只包含文本。
输出XML格式的数据
以代码为例
try {
DocumentBuilderFactorybuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=builderfactory.newDocumentBuilder();
Documentdocument=builder.parse(getAssets().open("languages.xml"));
Elementelement=document.getDocumentElement();
NodeListlist=element.getElementsByTagName("lan");
for(inti=0;i<list.getLength();i++){
Elementlan=(Element)list.item(i);
text.append(lan.getAttribute("id"+"\n"));
text.append(lan.getElementsByTagName("name").item(0).getTextContent()+"\n");
text.append(lan.getElementsByTagName("ide").item(0).getTextContent()+"\n");
}
} catch (Exception e) {
e.printStackTrace();
}
这段程序对应的XML文件
<?xmlversion="1.0" encoding="UTF-8"?>
<Languages cat="it">
<lan id="1">
<name>java</name>
<ide>eclipse</ide>
</lan>
<lan id="2">
<name>swift</name>
<ide>xcode</ide>
</lan>
<lan id="3">
<name>c#</name>
<ide>vs</ide>
</lan>
</Languages>
先通过文件操作流打开了对应的XML文件,将之写入一个list然后在for循环中,通过文本的对应的标签加入text中,然后在虚拟机中运行时,text可以显示。
创建XML格式的文件(以相同的内容的XML文件为例)
try{
DocumentBuilderFactorybuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=builderfactory.newDocumentBuilder();
Documentnewxml=builder.newDocument();
Elementlanguages=newxml.createElement("languages");
languages.setAttribute("cat","it");
//languages1create
Elementlan1=newxml.createElement("lan");
lan1.setAttribute("id","1");
Elementname1=newxml.createElement("name");
name1.setTextContent("java");
Elementide1=newxml.createElement("ide");
ide1.setTextContent("eclipse");
lan1.appendChild(name1);
lan1.appendChild(ide1);
languages.appendChild(lan1);
//languages2create
Elementlan2=newxml.createElement("lan");
lan2.setAttribute("id","2");
Elementname2=newxml.createElement("name");
name2.setTextContent("Swift");
Elementide2=newxml.createElement("ide");
ide2.setTextContent("XCode");
lan2.appendChild(name1);
lan2.appendChild(ide1);
languages.appendChild(lan2);
//languages3create
Elementlan3=newxml.createElement("lan");
lan3.setAttribute("id","3");
Elementname3=newxml.createElement("name");
name3.setTextContent("c#");
Elementide3=newxml.createElement("ide");
ide3.setTextContent("VisualStdio");
lan3.appendChild(name3);
lan3.appendChild(ide3);
languages.appendChild(lan3);
newxml.appendChild(languages);
TransformerFactorytransformerFactory=TransformerFactory.newInstance();
Transformertransformer=transformerFactory.newTransformer();
transformer.setOutputProperty("encoding","utf-8");
StringWritersw=new StringWriter();
transformer.transform(newDOMSource(newxml), new StreamResult(sw));
text.setText(sw.toString());
}
catch(Exception e){
e.printStackTrace();
}
其原理类似于JSON格式数据的创建
另付一个可以在线测试XML格式的网站:
http://json.parser.online.fr