Heim > Artikel > Backend-Entwicklung > Parse XML Tree-Codebeispiel zum Parsen von XML-Dateien
verfügt jetzt über einen Tokenizer und die zurückgegebenen Tokens sind XML-Tags oder -Inhalte, z. B.
(open, html)(inner, hello)(close, html)
bedeutet100db36a723c770d327fc0aef2ce13b1hello73a6ac4ed44ffec12cee46588e518a5e
, jede Klammer und ihre Der Inhalt ist ein Token. So stellen Sie diese XML-Datei dar.
Zeit O(N) Raum O(N)
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.
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!