Heim  >  Artikel  >  Backend-Entwicklung  >  Parse XML Tree-Codebeispiel zum Parsen von XML-Dateien

Parse XML Tree-Codebeispiel zum Parsen von XML-Dateien

黄舟
黄舟Original
2017-03-17 16:58:551968Durchsuche

Parse XML Tree

verfügt jetzt über einen Tokenizer und die zurückgegebenen Tokens sind XML-Tags oder -Inhalte, z. B. (open, html)(inner, hello)(close, html) bedeutet 100db36a723c770d327fc0aef2ce13b1hello73a6ac4ed44ffec12cee46588e518a5e, jede Klammer und ihre Der Inhalt ist ein Token. So stellen Sie diese XML-Datei dar.

Stapelmethode

Komplexität

Zeit O(N) Raum O(N)

Idee

Diese Frage Die Als erstes muss klar darüber nachgedacht werden, wie XML dargestellt werden soll. Da es sich bei XML um ein typisches Ein-Eltern-Mehrfach-Kind-Modell handelt, ist es besser, einen Baum zur Darstellung zu verwenden. Analysieren Sie dann, wie Tokenizer verwendet wird, um ein Token zu erhalten. Wenn es sich um ein offenes Token handelt, müssen wir möglicherweise auch neue Knoten unter diesem neuen Knoten erstellen. Wenn es sich um ein inneres Token handelt, müssen wir auch einen neuen Knoten erstellen, aber unter diesem Knoten gibt es keine neuen Knoten. Wenn es sich um ein Close-Token handelt, benötigen wir keine neuen Knoten und müssen sicherstellen, dass der vorherige offene Knoten keine neuen Knoten mehr akzeptiert und die neuen Knoten an die Knoten der vorherigen Ebene angehängt werden müssen. Hier verwenden wir den Stapel, um die Knoteninformationen der vorherigen Ebene beizubehalten und uns beim Aufbau des Baums zu helfen. Wenn es sich um ein offenes Token handelt, müssen wir einen neuen Knoten erstellen und ihn hinter dem vorherigen Knoten hinzufügen und zum Stapel hinzufügen. Wenn es sich um einen inneren Token handelt, müssen wir auch einen neuen Knoten erstellen und ihn hinter dem vorherigen Knoten hinzufügen, ihn jedoch nicht zum Stapel hinzufügen. Wenn es sich um ein Close-Token handelt, entfernen Sie den vorherigen Knoten vom Stapel.

Code

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){
        // 以右括号为delimiter
        StringTokenizer tknz = new StringTokenizer(str, ")");
        Stack<XMLNode> stk = new Stack<XMLNode>();
        // 将第一个open节点作为根节点压入栈中
        XMLNode root = convertTokenToTreeNode(tknz.nextToken());
        stk.push(root);
        while(!stk.isEmpty()){
            if(!tknz.hasMoreTokens()){
                break;
            }
            XMLNode curr = convertTokenToTreeNode(tknz.nextToken());
            // 得到上一层节点
            XMLNode father = stk.peek();
            // 根据当前节点的类型做不同处理
            switch(curr.type){
                // 对于Open节点,我们把它加入上一层节点的后面,并加入栈中
                case "open":
                    father.children.add(curr);
                    stk.push(curr);
                    break;
                // Close节点直接把上一层Pop出来就行了,这样就不会有新的节点加到上一层节点后面    
                case "close":
                    stk.pop();
                    break;
                // Inner节点只加到上一层节点后面    
                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<XMLNode> children;
    
    XMLNode(String type, String value){
        this.type = type;
        this.value = value;
        this.children = new ArrayList<XMLNode>();
    }
}

Das obige ist der detaillierte Inhalt vonParse XML Tree-Codebeispiel zum Parsen von XML-Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn