BB两句
一开始我也不会,就找资料,这种资料多的要命,一搜一大堆,眼花缭乱的,没看到满意的。。。
反正要掌握的,何不多写写,别人写的大多数是针对某个xml进行解析的,我不喜欢这样,太麻烦。。。
以下代码基本上可以解析平常xml格式的内容了,代码不需要怎么改动
走起
首先获取DOM解析最重要的工厂类,通过工厂类获取解析xml用到的对象,就是下面这俩。。
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
对象获取到了,就要解析xml了吧,解析xml当然要知道解析哪个xml啊,所以接下来就是设置要解析的XML。
这里说一下,DOM解析方式是先把整个XML都读取到内存中,然后进行解析,比较适合较小的XML文件
// 读取xml文件到内存中
Document document = documentBuilder.parse(new FileInputStream("src/msg.xml"));
上面这个是直接读取文件的,做android的大多数都是服务器返回的数据,不可能再写到文件中在读取,下面是直接读取String解析的放方法
String xml = "这里是你的xml字符串";
Document document = documentBuilder.parse(new InputSource(new StringReader(xml)));
看代码
public static void DomParser() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 读取xml文件到内存中
Document document = documentBuilder.parse(new FileInputStream("src/AndroidManifest.xml"));
// 获取根节点
Element documentElement = document.getDocumentElement();
// 获取根节点名称
System.out.print(documentElement.getTagName());
// 获取节点中的属性
NamedNodeMap attributes = documentElement.getAttributes();
// 遍历节点
for (int i = 0; i < attributes.getLength(); i++) {
System.out.print(" " + attributes.item(i).getNodeName() + "=" + attributes.item(i).getNodeValue());
}
// 无用,格式化打印出的信息用
System.out.println();
// 获取当前节点下的子节点
NodeList childNodes = documentElement.getChildNodes();
parserNode(childNodes);
}
/**
* 递归遍历xml节点和属性信息
*
* @param childNodes 节点NodeList对象
*/
public static void parserNode(NodeList childNodes) {
// 遍历节点
for (int i = 0; i < childNodes.getLength(); i++) {
// 去除无用节点字符,就是xml中节点之间的空格。
if (childNodes.item(i).getNodeType() != Node.TEXT_NODE) {
// 获取节点名称
String nodeName = childNodes.item(i).getNodeName();
// 获取当前节点下的子节点,如果没有childNodes1.getLength()会=1
NodeList childNodes1 = childNodes.item(i).getChildNodes();
// childNodes1.getLength()=1的时候表示当前节点下没有节点,只有值,直接打印出节点值
if (childNodes1.getLength() == 1) {
System.out.print("\t" + nodeName + "=" + childNodes.item(i).getTextContent());
} else {
System.out.print(nodeName);
}
// 获取当前节点下的属性并遍历属性
NamedNodeMap attributes = childNodes.item(i).getAttributes();
if (attributes != null) {
for (int j = 0; j < attributes.getLength(); j++) {
String attributesName = attributes.item(j).getNodeName();
String attributesValue = attributes.item(j).getNodeValue();
System.out.print(" " + attributesName + "=" + attributesValue);
}
}
System.out.println();
parserNode(childNodes1);
}
}
}
个人觉得比那些直接getElementsByTagName(String name)方法获取方便自由一点,再往上可以改改封装一下,使用反射应该就能应付大多数XML解析。