XML的读取和解析以及输出
XML的简介
XML即是Extensible Markup Language的缩写,是一种用于标记电子文件使之具有结构性的标记语言。XML是HTML的一个子集,并非是HTML的替代,二者具有相似性和区别。XML可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,具有以下特性:
1.XML类似于HTML。
2.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可以显示。
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