成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

[Algo] Parse XML Tree 解析XML文件

liuyix / 1986人閱讀

摘要:現(xiàn)在有一個(gè),返回的都是標(biāo)簽或者內(nèi)容,比如表示,每一個(gè)括號(hào)及其內(nèi)容是一個(gè),請(qǐng)問如何表示這個(gè)文件。棧法復(fù)雜度時(shí)間空間思路這題首先要想清楚的是,如何表示,因?yàn)槭堑湫偷囊桓付嘧?,我們用樹來表示比較好。如果是一個(gè)的,則把上一層節(jié)點(diǎn)彈出棧。

Parse XML Tree

現(xiàn)在有一個(gè)Tokenizer,返回的Token都是XML標(biāo)簽或者內(nèi)容,比如(open, html)(inner, hello)(close, html)表示hello,每一個(gè)括號(hào)及其內(nèi)容是一個(gè)Token,請(qǐng)問如何表示這個(gè)XML文件。

棧法 復(fù)雜度

時(shí)間 O(N) 空間 O(N)

思路

這題首先要想清楚的是,如何表示XML,因?yàn)閄ML是典型的一父多子,我們用樹來表示比較好。然后分析下如何用Tokenizer,Tokenizer有點(diǎn)像Iterator,每當(dāng)我們用Tokenizer拿到一個(gè)Token時(shí),如果這是一個(gè)Open的Token,我們需要新建一個(gè)節(jié)點(diǎn),這個(gè)新節(jié)點(diǎn)下面也有可能有新節(jié)點(diǎn)。如果是一個(gè)Inner的Token,我們也需要新建一個(gè)節(jié)點(diǎn),但這個(gè)節(jié)點(diǎn)下面不會(huì)有新的節(jié)點(diǎn)。如果是一個(gè)Close的Token,我們不需要新節(jié)點(diǎn),而且需要保證上一個(gè)Open節(jié)點(diǎn)不再接納新節(jié)點(diǎn)了,而對(duì)于新節(jié)點(diǎn)則要附在上一層的節(jié)點(diǎn)后面。這里,我們用??梢员A羯弦粚拥墓?jié)點(diǎn)信息,幫助我們建樹。如果這是一個(gè)Open的Token,我們需要新建一個(gè)節(jié)點(diǎn)加入上一層節(jié)點(diǎn)后面,并加入棧中。如果是一個(gè)Inner的Token,我們也需要新建一個(gè)節(jié)點(diǎn)加到上一層節(jié)點(diǎn)后面,但不加入棧中。如果是一個(gè)Close的Token,則把上一層節(jié)點(diǎn)彈出棧。

代碼
public class XMLParser {
    
    public static void main(String[] args){
        XMLParser xml = new XMLParser();
        XMLNode root = xml.parse("(open,html)(open,head)(inner,welcome)(close,head)(open,body)(close,body)(close,html)");
        xml.printXMLTree(root, 0);
    }
    
    public XMLNode parse(String str){
        // 以右括號(hào)為delimiter
        StringTokenizer tknz = new StringTokenizer(str, ")");
        Stack stk = new Stack();
        // 將第一個(gè)open節(jié)點(diǎn)作為根節(jié)點(diǎn)壓入棧中
        XMLNode root = convertTokenToTreeNode(tknz.nextToken());
        stk.push(root);
        while(!stk.isEmpty()){
            if(!tknz.hasMoreTokens()){
                break;
            }
            XMLNode curr = convertTokenToTreeNode(tknz.nextToken());
            // 得到上一層節(jié)點(diǎn)
            XMLNode father = stk.peek();
            // 根據(jù)當(dāng)前節(jié)點(diǎn)的類型做不同處理
            switch(curr.type){
                // 對(duì)于Open節(jié)點(diǎn),我們把它加入上一層節(jié)點(diǎn)的后面,并加入棧中
                case "open":
                    father.children.add(curr);
                    stk.push(curr);
                    break;
                // Close節(jié)點(diǎn)直接把上一層Pop出來就行了,這樣就不會(huì)有新的節(jié)點(diǎn)加到上一層節(jié)點(diǎn)后面    
                case "close":
                    stk.pop();
                    break;
                // Inner節(jié)點(diǎn)只加到上一層節(jié)點(diǎn)后面    
                case "inner":
                    father.children.add(curr);
                    break;
            }
        }
        return root;
    }
    
    private XMLNode convertTokenToTreeNode(String token){
        token = token.substring(1);
        String[] parts = token.split(",");
        return new XMLNode(parts[0], parts[1]);
    }
    
    private void printXMLTree(XMLNode root, int depth){
        for(int i = 0; i < depth; i++){
            System.out.print("-");
        }
        System.out.println(root.type + ":" + root.value);
        for(XMLNode node : root.children){
            printXMLTree(node, depth + 1);
        }
    }
}

class XMLNode {
    String type;
    String value;
    List children;
    
    XMLNode(String type, String value){
        this.type = type;
        this.value = value;
        this.children = new ArrayList();
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/66182.html

相關(guān)文章

  • 基于機(jī)器學(xué)習(xí)的DAG調(diào)度平臺(tái)

    摘要:算子背后是實(shí)現(xiàn)的一些算法組件機(jī)器學(xué)習(xí)前端交互機(jī)器學(xué)習(xí)平臺(tái)前端主要是將機(jī)器學(xué)習(xí)的流程裝成一個(gè),定義各個(gè)算子的出入?yún)?,以及算子的配置參?shù),組裝成一個(gè)文件,傳給調(diào)圖平臺(tái)是方式交互,是通過文件定義,通過。 什么是DAG? 有向無環(huán)圖 樹形結(jié)構(gòu):除根節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有且僅有一個(gè)上級(jí)節(jié)點(diǎn),下級(jí)節(jié)點(diǎn)不限。根節(jié)點(diǎn)沒有上級(jí)節(jié)點(diǎn)。 圖結(jié)構(gòu):每個(gè)節(jié)點(diǎn)上級(jí)、下級(jí)節(jié)點(diǎn)數(shù)不限。 DAG調(diào)度平臺(tái)的定義及場(chǎng)景 任務(wù)調(diào)度...

    LucasTwilight 評(píng)論0 收藏0
  • XMLSignature中使用BouncyCastle做RSA

    Abstract There is an article shows demo code for making XMLSignature by using Java XML Digital Signature API, where it actually uses org.jcp.xml.dsig.internal.dom.XMLDSigRI to do DOM formation, and th...

    LiangJ 評(píng)論0 收藏0
  • Spring解密 - 自定義標(biāo)簽與解析

    摘要:自定義標(biāo)簽在講解自定義標(biāo)簽解析之前,先看下如何自定義標(biāo)簽定義文件定義一個(gè)文件描述組件內(nèi)容聲明命名空間值得注意的是與可以是不存在,只要映射到指定就行了。 Spring是一個(gè)開源的設(shè)計(jì)層面框架,解決了業(yè)務(wù)邏輯層和其他各層的松耦合問題,將面向接口的編程思想貫穿整個(gè)系統(tǒng)應(yīng)用,同時(shí)它也是Java工作中必備技能之一... 前言 在 上一節(jié) Spring解密 - 默認(rèn)標(biāo)簽的解析 中,重點(diǎn)分析了...

    Taste 評(píng)論0 收藏0
  • XML Notebook

    摘要:不使用外部聲明屬性單雙引號(hào)皆可大小寫敏感大小寫不敏感必須有根元素實(shí)體引用實(shí)體任何包含數(shù)據(jù)的項(xiàng)實(shí)體中要使用轉(zhuǎn)義字符無論寫什么,都當(dāng)作普通文本逐行掃描,邊掃描邊解析,速度快不能對(duì)節(jié)點(diǎn)進(jìn)行修改構(gòu)造,方便遍歷和修改對(duì)于大文件,內(nèi)存壓力大獲取子 XML: EXtensible Markup Language 1. Basic Syntax 1.1 Processing instruction ...

    darkbug 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

liuyix

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<