# Eigener XML-Parser



## Marco01_809 (28. Feb 2011)

Hi Forum. 

Ich bin dabei einen eigenen kleinen "<tag>value</tag>"-Xml-Parser zu schreiben.


```
public class Xml {
	protected final String xmlCode;
	protected String parsedCode;

	public static void main(String[] args) {
		Xml xml = new Xml("<xml>\n    <test>XmlData</test>\n    <tag2><epic>imba</epic><tag3></tag3></tag2></xml>");
		xml.parseXmlCode();
		System.out.println(xml.getParsedCode());
	}

	public Xml(String xmlCode) {
		this.xmlCode = xmlCode;
	}

	public String getXmlCode() {
		return this.xmlCode;
	}

	public String getParsedCode() {
		return this.parsedCode;
	}

	public void parseXmlCode() {
		if (this.parsedCode == null)
			this.parsedCode = this.internalParse((this.xmlCode).toCharArray());
	}

	protected String internalParse(char[] xmlCode) {
		StringBuilder data = new StringBuilder();
		byte xmlEbene = 0;
		boolean isTag = false, isCloseTag = false;
		for (char c : xmlCode) {
			switch (c) {
			case '<':
				isTag = true;
				break;
			case '>':
				xmlEbene++;
				if (!isCloseTag)
					data.append(": ");
				data.append("\n");
				for (int i = 0; i < xmlEbene; i++)
					data.append("    ");
				isTag = false;
				isCloseTag = false;
				break;
			case '/':
				if (isTag) {
					xmlEbene -= 2;
					isCloseTag = true;
					break;
				}
			default:
				if (!isCloseTag)
					data.append(c);
			}
		}
		return data.toString();
	}
}
```

Das hier ist meine Xml-Klasse.

Sie soll aus:
[XML]<xml>
	<test>XmlData</test>
	<tag2><epic>imba</epic><tag3></tag3></tag2>
</xml>[/XML]
folgendes machen:

```
xml:
    test: "XmlData"
    tag2:
        epic: "imba"
        tag3: ""
```

Im Moment wird aus dem obigen Xml aber:

```
xml: 
    
    test: 
        XmlData
    
    tag2: 
        epic: 
            imba
        tag3:
```

Ich möchte meine Funktion internalParse() Nicht zu sehr überladen. Jedoch habe ich keine Ahnung wie ich das hübsch lösen soll. Hab schon jedemenge rumprobiert.

Bitte um Hilfe, danke


----------



## Antoras (28. Feb 2011)

Das leidige Thema Parserbau. Daran kannst dir die Zähne ausbeißen wenn es nicht richtig gemacht wird. Jede Abkürzung, die du nimmst wird später in Mehraufwand resultieren. Konkret heißt das: Teile deinen Code in Lexer und Parser auf, baue einen Syntaxbaum und evaluiere dann jenen Baum. Hört sich kompliziert an? Ist es auch, zumindest am Anfang.

Wofür schreibst du den Parser? Nur zum üben? Dann würde ich dir empfehlen nicht gleich bei XML, sondern mit einer etwas einfacheren Sprache anzufangen wie z.B. Brainfuck. Ein kleiner Matheparser ist für den Anfang auch nicht schlecht.


----------

