原文链接:http://blog.csdn.net/chaoy1116/article/details/45224467
XML文件
- <?xml version="1.0" encoding="UTF-8"?>
- <persons
- xmlns:yd="http://www.china-mobile.com"
- xmlns:lt="http://www.china-unicome.com">
- some_content
- <person index="1">
- <name>yuanzhifei89</name><age>100</age><married>false</married>
- <!-- 移动号码 --><yd:phone yd:id="amj08102">12345678</yd:phone>
- <!-- 联通号码 --><lt:phone lt:id="cmk35203">87654321</lt:phone>
- <![CDATA[<> <div>]]><
- </person>
- </persons>
解析代码
- // 创建xml解析器
- XmlPullParser parser = mFactory.newPullParser();
- parser.setInput(new FileReader(xmlFile));
- // 因为使用的xml涉及了命名空间,所以启用命名空间
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- int eventType = 0;
- // xml和person间的IGNOREABLE_WHITESPACE
- eventType = parser.nextToken();
- parser.isWhitespace(); // IGNOREABLE_WHITESPACE总是为whitespace
- // 返回这两个前缀对应的命名空间uri,但此时还未解析到命名空间部分,所以均返回null
- parser.getNamespace("lt");
- parser.getNamespace("yd");
- // 起始标签<persons>
- eventType = parser.nextToken();
- parser.getAttributeCount(); // 0,persones标签没有属性
- // 命名空间已解析
- parser.getNamespace("lt"); // http://www.china-unicome.com
- parser.getNamespace("yd"); // http://www.china-mobile.comp
- // <persons>和<person>间的text(空白也算在text内容中)
- eventType = parser.nextToken();
- parser.isWhitespace(); // false,只要含有非空白字符就不是whitespace
- // 起始标签<person>
- eventType = parser.nextToken();
- // <person>和<name>间的text
- eventType = parser.nextToken();
- parser.isWhitespace(); // true
- // 起始标签<name>
- eventType = parser.nextToken();
- parser.getLineNumber(); // 第7行
- parser.getColumnNumber(); // 第9列
- // name标签中的text:yuanzhifei89
- eventType = parser.nextToken();
- // 结束标签</name>
- eventType = parser.nextToken();
- // 起始标签<age>
- eventType = parser.nextToken();
- parser.getNamespace(); // "",age没有命名空间
- parser.isEmptyElementTag(); // false,age并不是<age/>这种空标签
- parser.getDepth(); // 3,<persons>一层,<person>二层,到它就是三层
- parser.getNamespaceCount(parser.getDepth()); // 2,到三层为止解析到了2个命名空间
- // age标签中的text:100
- eventType = parser.nextToken();
- // 结束标签</age>
- eventType = parser.nextToken();
- // 开始标签<married>
- eventType = parser.nextToken();
- // 标签married间的text:false
- eventType = parser.nextToken();
- // 结束标签</married>
- eventType = parser.nextToken();
- // </married>和<!-- 之间的text
- eventType = parser.nextToken();
- // COMMENT备注内容
- eventType = parser.nextToken();
- // 开始标签<yd:phone>
- eventType = parser.nextToken();
- parser.getAttributeCount(); // 1,它有一个属性
- parser.getNamespace(); // http://www.china-mobile.com,它是该命名空间下的元素
- parser.getPrefix(); // yd,命名空间前缀是yd
- parser.getAttributeName(0); // id,第1个属性的名称
- parser.getAttributeNamespace(0); // http://www.china-mobile.com,属性也在该命名空间下
- parser.getAttributePrefix(0); // yd,所以前缀也一样
- parser.getAttributeValue(0); // amj08102,属性值
- parser.getDepth(); // 3,和<age>一样,<persons>一层,<person>二层,到它是三层
- parser.getNamespaceCount(parser.getDepth()); // 2,到三层为止解析到了2个命名空间
- // 标签<yd:phone>间的text:12345678
- eventType = parser.nextToken();
- // 结束标签</yd:phone>
- eventType = parser.nextToken();
- // </yd:phone>和<!--间的text
- eventType = parser.nextToken();
- parser.getName(); // phone,启用命名空间时返回phone;如果不启用会返回yd:phone
- // COMMENT 备注内容
- eventType = parser.nextToken();
- parser.getText(); // 备注内容
- // 开始标签<lt:phone>
- eventType = parser.nextToken();
- // 标签<lt:phone>间的内容
- eventType = parser.nextToken();
- // 结束标签</lt:phone>
- eventType = parser.nextToken();
- // </lt:phone>和<![CDATA[[]]>间的text
- eventType = parser.nextToken();
- // CDSECT:CDATA内容
- eventType = parser.nextToken();
- parser.getName(); // null
- parser.getText(); // CDATA内容
- // 实体引用lt
- eventType = parser.nextToken();
- parser.getName(); // 实体引用名lt
- parser.getText(); // 所引用的内容<
- // 实体引用lt和</person>间的text
- eventType = parser.nextToken();
- // 结束标签</person>
- eventType = parser.nextToken();
- // </person>和</persons>间的text
- eventType = parser.nextToken();
- // 结束标签</persons>
- eventType = parser.nextToken();
- // 文档结束