XML解析之DOM解析

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解析。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绊诲,一起剝皮案震驚了整個(gè)濱河市送粱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掂之,老刑警劉巖抗俄,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異板惑,居然都是意外死亡橄镜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門冯乘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晒夹,你說我怎么就攤上這事裆馒℃⒚ィ” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵喷好,是天一觀的道長翔横。 經(jīng)常有香客問我,道長梗搅,這世上最難降的妖魔是什么禾唁? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮无切,結(jié)果婚禮上荡短,老公的妹妹穿的比我還像新娘。我一直安慰自己哆键,他們只是感情好掘托,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著籍嘹,像睡著了一般渗磅。 火紅的嫁衣襯著肌膚如雪备徐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音负懦,去河邊找鬼。 笑死坯门,一個(gè)胖子當(dāng)著我的面吹牛凳干,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凭涂,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼祝辣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了切油?” 一聲冷哼從身側(cè)響起蝙斜,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澎胡,沒想到半個(gè)月后孕荠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攻谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年稚伍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚宦。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡个曙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出受楼,到底是詐尸還是另有隱情垦搬,我是刑警寧澤呼寸,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站猴贰,受9級特大地震影響对雪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜米绕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一瑟捣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栅干,春花似錦迈套、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劫笙,卻和暖如春芙扎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背填大。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工戒洼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人允华。 一個(gè)月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓圈浇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親靴寂。 傳聞我的和親對象是個(gè)殘疾皇子磷蜀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)百炬,斷路器褐隆,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法剖踊,內(nèi)部類的語法庶弃,繼承相關(guān)的語法,異常的語法德澈,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 假期比上班還累歇攻,是因?yàn)槠诖潘桑瑓s沒有真正輕松梆造。比如昨天缴守。登高踏青祭祖,聊天聚會吃飯,練車遠(yuǎn)行發(fā)飆斧散,沒管孩子供常,沒...
    安曼閱讀 383評論 0 0
  • 明天是周一了摊聋,新的開始鸡捐。年就過去了,孩子們要上學(xué)了麻裁,又年長一算了箍镜,開始新的學(xué)習(xí),新的一段煎源。 或許對于一...
    小鹿panda閱讀 526評論 1 3