BB兩句
一開始我也不會,就找資料较鼓,這種資料多的要命椎木,一搜一大堆,眼花繚亂的博烂,沒看到滿意的香椎。。禽篱。
反正要掌握的畜伐,何不多寫寫,別人寫的大多數(shù)是針對某個(gè)xml進(jìn)行解析的躺率,我不喜歡這樣玛界,太麻煩万矾。。慎框。
以下代碼基本上可以解析平常xml格式的內(nèi)容了勤众,代碼不需要怎么改動
走起
首先獲取DOM解析最重要的工廠類,通過工廠類獲取解析xml用到的對象,就是下面這倆鲤脏。们颜。
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
對象獲取到了,就要解析xml了吧猎醇,解析xml當(dāng)然要知道解析哪個(gè)xml啊窥突,所以接下來就是設(shè)置要解析的XML。
這里說一下硫嘶,DOM解析方式是先把整個(gè)XML都讀取到內(nèi)存中阻问,然后進(jìn)行解析,比較適合較小的XML文件
// 讀取xml文件到內(nèi)存中
Document document = documentBuilder.parse(new FileInputStream("src/msg.xml"));
上面這個(gè)是直接讀取文件的沦疾,做android的大多數(shù)都是服務(wù)器返回的數(shù)據(jù)称近,不可能再寫到文件中在讀取,下面是直接讀取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文件到內(nèi)存中
Document document = documentBuilder.parse(new FileInputStream("src/AndroidManifest.xml"));
// 獲取根節(jié)點(diǎn)
Element documentElement = document.getDocumentElement();
// 獲取根節(jié)點(diǎn)名稱
System.out.print(documentElement.getTagName());
// 獲取節(jié)點(diǎn)中的屬性
NamedNodeMap attributes = documentElement.getAttributes();
// 遍歷節(jié)點(diǎn)
for (int i = 0; i < attributes.getLength(); i++) {
System.out.print(" " + attributes.item(i).getNodeName() + "=" + attributes.item(i).getNodeValue());
}
// 無用哮塞,格式化打印出的信息用
System.out.println();
// 獲取當(dāng)前節(jié)點(diǎn)下的子節(jié)點(diǎn)
NodeList childNodes = documentElement.getChildNodes();
parserNode(childNodes);
}
/**
* 遞歸遍歷xml節(jié)點(diǎn)和屬性信息
*
* @param childNodes 節(jié)點(diǎn)NodeList對象
*/
public static void parserNode(NodeList childNodes) {
// 遍歷節(jié)點(diǎn)
for (int i = 0; i < childNodes.getLength(); i++) {
// 去除無用節(jié)點(diǎn)字符刨秆,就是xml中節(jié)點(diǎn)之間的空格。
if (childNodes.item(i).getNodeType() != Node.TEXT_NODE) {
// 獲取節(jié)點(diǎn)名稱
String nodeName = childNodes.item(i).getNodeName();
// 獲取當(dāng)前節(jié)點(diǎn)下的子節(jié)點(diǎn)忆畅,如果沒有childNodes1.getLength()會=1
NodeList childNodes1 = childNodes.item(i).getChildNodes();
// childNodes1.getLength()=1的時(shí)候表示當(dāng)前節(jié)點(diǎn)下沒有節(jié)點(diǎn)衡未,只有值,直接打印出節(jié)點(diǎn)值
if (childNodes1.getLength() == 1) {
System.out.print("\t" + nodeName + "=" + childNodes.item(i).getTextContent());
} else {
System.out.print(nodeName);
}
// 獲取當(dāng)前節(jié)點(diǎn)下的屬性并遍歷屬性
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);
}
}
}
個(gè)人覺得比那些直接getElementsByTagName(String name)方法獲取方便自由一點(diǎn)家凯,再往上可以改改封裝一下缓醋,使用反射應(yīng)該就能應(yīng)付大多數(shù)XML解析。