1. 定义
XML即 extensible Markup Language 是一种数据标记语言 结构化数据、存储 html用于显示信息而 XML用于存储
- 属性值必须加引号
- 实体引用
元素不能使用和<新元素的开始
- 注释
- XML的元素、属性和属性值
文档实例
Harry Potter JK.Rowling woshiPM Carson_Ho
其中是根元素是子元素也是元素类型之一而中含有属性即category属性值是CHILDREN而元素则拥有文本内容 JK.Rowling
- 元素与属性的差别 属性即提供元素额外的信息但不属于数据组成部分的信息。
范例一
Harry Potter JK.Rowling
范例二
CHILDREN Harry Potter JK.Rowling
范例一和二提供的信息是完全相同的。
一般情况下请使用元素因为
使用属性的情况用于分配ID索引用于标识XML元素。
实例
CHILDREN Harry Potter JK.Rowling CHILDREN Harry Potter JK.Rowling
上述属性id仅用于标识不同的便签并不是数据的组成部分
- XML元素命名规则
-
CDATA 不被解析器解析的文本数据所有xml文档都会被解析器解析cdata区段除外
-
PCDATA 被解析的字符数据
5. XML树结构
XML文档中的元素会形成一种树结构从根部开始然后拓展到每个树叶节点,下面将以实例说明XML的树结构。
- 假设一个XML文件如下
-
其树结构如下
树结构 .png -
XML节点解释 XML文件是由节点构成的。它的第一个节点为“根节点”。一个XML文件必须有且只能有一个根节点其他节点都必须是它的子节点。
this 代表整个XML文件它的根节点就是 this.firstChild 。 this.firstChild.childNodes 则返回由根节点的所有子节点组成的节点数组。
每个子节点又可以有自己的子节点。节点编号由0开始根节点的第一个子节点为 this.firstChild.childNodes[0]它的子节点数组就是this.firstChild.childNodes[0].childNodes 。
根节点第一个子节点的第二个子节点 this.firstChild.childNodes[0].childNodes[1]它返回的是一个XML对象Object 。这里需要特别注意节点标签之间的数据本身也视为一个节点 this.firstChild.childNodes[0].childNodes[1].firstChild 而不是一个值。
我们解析XML的最终目的当然就是获得数据的值this.firstChild.childNodes[0].childNodes[1].firstChild.nodeValue 。
请注意区分节点名称和之间的文本内容男可以当作是节点也可以当作是一个值
节点 名称this.firstChild.childNodes[0].childNodes[1] 文本内容this.firstChild.childNodes[0].childNodes[1].firstChild
值 名称this.firstChild.childNodes[0].childNodes[1].nodeValue 节点名称有时也是我们需要的数据 文本内容this.firstChild.childNodes[0].childNodes[1].nodeName
在了解完XML之后是时候来学下如何进行XML的解析了
6. 解析方式
- 解析XML即从XML中提取有用的信息
- XML的解析方式主要分为2大类 示意图
6.1 DOM方式
- 简介Document Object Model即 文件对象模型是 一种 基于树形结构节点 subject.xml Java Android Swift# iOS Html5 Web // 解析的核心代码 public static List getSubjectList(InputStream stream) { tv (TextView)findViewById(R.id.tv); try { //打开xml文件到输入流 InputStream stream getAssets().open("subject.xml"); //得到 DocumentBuilderFactory 对象 DocumentBuilderFactory builderFactory DocumentBuilderFactory.newInstance(); //得到DocumentBuilder对象 DocumentBuilder builder builderFactory.newDocumentBuilder(); //建立Document存放整个xml的Document对象数据 Document document builder.parse(stream); //得到 XML数据的"根节点" Element element document.getDocumentElement(); //获取根节点的所有language的节点 NodeList list element.getElementsByTagName("language"); //遍历所有节点 for (int i 0;i
- 特点 一种 基于事件流驱动、通过接口方法解析 的XML解析方法
解析原理
示意图
- 解析实例 在使用SAX解析XML文档时关键在于 自定义自己的Handler处理类 Override public void startDocument() throws SAXException{ } Override public void startElement(String uri,String localName,String qName, Attributes attributes) throws SAXException{ } Override public void characters(char[] ch,int start,int length) throws SAXException{ } Override public void endElement(String uri,String localName,String qName) throws SAXException{ } Override public void endDocument() throws SAXException{ } }
- 特点 Android中自带了Pull解析的jar包故不需额外导入第三方jar包
// Pull使用循环解析XmlPullParserFactory factory XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser factory.newPullParser(); xml.setInput(new StringReader(xmlData)); int eventType xmlPullParser.getEventType(); while(eventType!XmlPullParser.END_DOCUMENT){ String nodeName xmlPullParser.getName(); switch(eventType){ case XmlPullParser.START_DOCUMENT:{} case XmlPullParser.START_TAG:{} case XmlPullParser.END_TAG:{} } eventType parser.next(); }
- 解析实例
public class MainActivity extends Activity { private EditText et; private Button myButton; Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myButton (Button) this.findViewById(R.id.btn01); et (EditText) this.findViewById(R.id.edittext01); myButton.setOnClickListener(new OnClickListener() { //可变字符序列比StringBuffer块 StringBuilder sb new StringBuilder(""); Resources res getResources(); XmlResourceParser xrp res.getXml(R.xml.subject); Override public void onClick(View v) { int counter 0; try { // 判断是否到了文件的结尾 while (xrp.getEventType() ! XmlPullParser.END_DOCUMENT) { //文件的内容的起始标签开始这里的起始标签是subject.xml文件里面标签下面的第一个标签 int eventTypexrp.getEventType(); switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: String tagname xrp.getName(); if (tagname.endsWith("language")) { counter; sb.append("这是第" counter "种语言""\n"); //可以调用XmlPullParser的getAttributte()方法来获取属性的值 sb.append("语言id是"xrp.getAttributeValue(0)"\n"); } else if(tagname.equals("name")){ //可以调用XmlPullParser的nextText()方法来获取节点的值 sb.append("语言名称是"xrp.nextText()"\n"); } else if(tagname.equals("teacher")){ sb.append("用途是"xrp.nextText()"\n"); } break; case XmlPullParser.END_TAG: break; case XmlPullParser.TEXT: break; } //解析下一个事件 xrp.next(); } //StringBuilder要调用toString()方法并显示 et.setText(sb.toString()); } catch (XmlPullParserException e) { } catch (IOException e) { e.printStackTrace(); } } }); }
- 特点 下面用一张图总结XML的主流解析方法 示意图
转:https://www.cnblogs.com/zquan/p/9393214.html
- 特点 Android中自带了Pull解析的jar包故不需额外导入第三方jar包