# txt. Datei in xml datei konvertieren



## guest--asking (8. Sep 2010)

Hallo alle zusammen,
Ich möchte eine txt-Datei mit java auslesen welche in .net serialisierte objekte bzw. objektstrukturen beinhaltet. Weiß einer ob es für java eine solche Bibliothek gibt oder wie ich das sonst machen könnte???
Danke im Voraus an alle!!!


----------



## XHelp (8. Sep 2010)

Ich weiß weder was es mit txt noch mit xml zu tun hat. Ich denke das wird nicht so ganz klappen. Allein schon weil die Objekte aus .net in Java nicht existieren... Du könntest dir aber schon die Struktur angucken, eine Parser schreiben, der die Werte rausließt und dann in analoge Java-Objekte setzen.
Aber wäre es nicht einfacher, wenn du gleich nur die wichtigsten Werte aus .net in text Form speicherst?


----------



## guest--asking (9. Sep 2010)

Gut, dann frage ich mal anders, ich habe eine textdatei in der sichtbare Objektstrukturen enthalten sind und möchte diese auslesen, weiß aber nicht wie, ein Auszug:

(objectcontent) [
   (objectcontent) {
      obj = 'abc',
      propSet = (properties) [
         (properties) {
            name = 'description',
            val = (abcdescription) {
               value = (elDescr) [
                  (elDescr) {
                     val1 = 'asd',
                     val2 = 'asd',
                     val3 = '1'
...
...

daraus soll <abc><properties><val1 = "asd"/><val2 ="asd"/><val3 = "1"/></properties></abc> oder sowas in der Art


----------



## XHelp (9. Sep 2010)

Dazu müsstest du einen Parser schreiben. Durch die Klammersetzung sind ja die Bereiche eindeutig abgetrennt, so dass du weißt wo du dich befindest.


----------



## guest--asking (9. Sep 2010)

hättest du vielleicht einen Ansatz für mich oder ein Code-Beispiel, steh total auf dem Schlauch...


----------



## XHelp (9. Sep 2010)

Du gehst die Datei durch, wenn du "(objectcontent) [" findest, dann suchst du nach "obj = " links davon steht dann der Name usw.


----------



## guest--asking (9. Sep 2010)

Erstmal danke,
Ich habe alles mögliche probiert aber mein problem ist das ich mehrer zeilen habe beispielsweise:

objekt a(
-------variable b = 1
-------variable d = 2
........
objekt b(
-------variable a = 3
-------variable d = 4

wie kriege ich das ausgelesen damit es auch jedem objekt zugeordnet werden kann, kannst mir jemand ein java-code beispiel geben,danke im voraus


----------



## XHelp (9. Sep 2010)

Du könntest ja die Bereiche abtrennen.
wenn du "objekt" triffst, dann steht weiter der Name und eine Klammer.
Dann setzt du 
	
	
	
	





```
int brackets
```
 auf 1 du gehst weiter im text. Bei jedem 
	
	
	
	





```
(
```
 erhöhst du die Anzahl um 1, bei jedem 
	
	
	
	





```
)
```
 machst du -1. Sobald du bei 0 angekommen ist. ist das Objekt zu Ende. Du hast also die Anfangsposition und die Endposition.


----------



## guest--asking (9. Sep 2010)

Hey das mit den brackets ist ne verdammt gute Idee, danke dafür erstmal. Also ich steh total auf dem Schlauch
Kannst du mir nicht in Java-Code zeigen wie ich bei z.b. value a = '3' in der datei, es der es dem objekt x in java zuweisen kann, also s.setA(..)....


----------



## XHelp (10. Sep 2010)

Wenn du immer die gleichen Objekte einliest, dann kannst du auch IFs verwenden (sofern es nicht 1000 Variablen sind). Ansonsten sieht es verdächtig nach Reflection aus:

```
public class SomeClass {
	private int a = 20;

	public void setA(int a) {
		this.a = a;
	}

	public SomeClass(String s) {
		System.out.println("Alter Wert: " + a);
		String[] line = s.split("=");
		try {
			//hier suchst du die "setA" Methode, die int als Parameter erwartet
			Method setter = this.getClass().getDeclaredMethod(
					"set" + line[0].toUpperCase(), new Class[] { int.class });
			//hier führst du die aus, und übergibst ihr die gewünschte Zahl
			setter.invoke(this, new Object[] { Integer.parseInt(line[1]) });
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("Neuer Wert: " + a);
	}

	public static void main(String[] args) {
		SomeClass someObject = new SomeClass("a=123");
	}
}
```
Die Exception habe ich nur übersichtshalber zusammengefasst. Vllt hilft es dir ja weiter.
(Du musst aber dabei auf Groß- und Kleinschreibung achten, und ob die Methode überhaupt existiert und und und, also ist das ganze jetzt nicht die trivialste Aufgabe)


----------



## guest--asking (10. Sep 2010)

Vielen vielen Dank.
Aber ich glaube das kriege ich niemals hin, denn die Datei die ausgelesen werden muss hat ca 86000 Zeilen mit tausenden von verschachtelten Objekten und ihren properties die selbst wieder eigene verschachtelte properties haben und und und .... :-(


----------



## XHelp (10. Sep 2010)

Im Endeffekt musst du nur einen Parser basteln, der das lesen kann. Rekursion wäre da auch ein gutes Stichwort.
Ob er anschließend 2 Objekte oder 2000 Objekte einlesen soll, ist völlig egal (sofern er so funktioniert, wie er funktionieren soll).
Aber um nochmal die Frage aus dem 1. Post aufzugreifen: kannst du nicht einfach bereits aus .net in passender Form die Daten bekommen?


----------



## guest--asking (10. Sep 2010)

Gäbe es vielleicht die möglichkeit mit Ihnen zu chatten(icq oder so) da kann ich mein Problem etwas schneller erklären warum ich es für unlösbar halte?


----------



## XHelp (10. Sep 2010)

Kannst ja in den IRC Chanel: java-forum.org - IRC-Chat kommen... aber vor allem kannst du mich duzen


----------



## guest--asking (10. Sep 2010)

```
(ObjectContent) [
   (ObjectContent) {
      dynamicProperty = (DynamicProperty) [],
      obj = 'objektA',
      propSet = (DynamicProperty) [
         (DynamicProperty) {
            name = 'description',
            val = (Description) {
               dynamicProperty = (DynamicProperty) [],
               privilege = (ElementDescription) [
                  (ElementDescription) {
                     label = 'abc',
                     summary = 'def',
                     key = 'ghi'
                  }
				]
			}
		}
	}
]
```

Das ist ein Auszug, wie soll ich das also mit oben genannter Methode parsen?


----------



## Wildcard (11. Sep 2010)

Ich schätze mal [] steht für ein Array und { } für ein einzelnes Objekt?
Grammatik in Xtext schreiben, daraus den Parser und ein EMF Modell generieren.
Die Text Datei mit dem generierten Code laden, das Root Element in eine EMF XMLResource stecken

Da das ganze nur eine simple Grammatik und 5 Zeilen Java Code erfordert habe ich es implementiert.

Grammatik:

```
grammar org.javaforum.sample.SampleDsl with org.eclipse.xtext.common.Terminals

generate sampleDsl "http://www.javaforum.org/sample/SampleDsl"

Model:
	objects+=AbstractObject*;

AbstractObject:
	Object | Array;

Object:
	'(' name=ID ')' '{' contents += Property (',' contents+=Property )* '}';
	  
Array:
	'(' name=ID ')' '['contents += AbstractObject (',' contents+=AbstractObject)* ']' ;
	
Property:
	name=ID '=' value=Value;
	
Value:
	AbstractObject | StringValue;
	
StringValue:
	value=STRING;
```

Code zum Umwandeln in XML:

```
public static void main(String[] args) throws IOException {
		Injector injector = new SampleDslStandaloneSetup().createInjectorAndDoEMFRegistration();
		XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
		Resource resource = resourceSet.getResource(URI.createFileURI("src/org/javaforum/sample/sample.txt"), true);
		EList<EObject> contents = resource.getContents();
		XMLResource out = new XMLResourceImpl();
		out.getContents().addAll(contents);
		out.save(System.out, null);

	}
```
Du bekommst übrigens auch gleich einen Eclipse Editor mit Syntax Highlighting, Outline, Autocompletion, Live Validierung,... generiert, aber das wirst du wohl gar nicht brauchen...

Xtext


----------



## guest--asking (11. Sep 2010)

Hey vielen Dank, das kannte ich gar nicht, aber ein problem hab ich noch: ich bekomme immer ein Fehlermeldung dass ich eine resource factory registrieren soll


----------



## guest--asking (11. Sep 2010)

Hat sich erledigt ich habs!!!,DANKE,DANKE,DANKE!!!
Gibt es auch eine Möglichkeit, dass Dinge die nicht in der Sprache definiert wurden vom Parser ignoriert werden. Letze Frage noch sorry dann ist das Thema durch!!!!


----------



## Wildcard (11. Sep 2010)

> Gibt es auch eine Möglichkeit, dass Dinge die nicht in der Sprache definiert wurden vom Parser ignoriert werden


Hidden Tokens wären eine Möglichkeit. Gib mal ein konkretes Beispiel


----------



## guest--asking (12. Sep 2010)

Ich krieg das mit der Resource Factory registration nicht hin, hab folgendes:
Resource.Factory.Registry.INSTANCE.getProtocolToFactoryMap().put("*", ??);
Weiter weiß ich nicht, ist ziemlich kompliziert das ganze Xtext.


----------



## Wildcard (12. Sep 2010)

Ich hab dir doch Beispielcode gegeben.

```
new YourLanguageNameStandaloneSetup().createInjectorAndDoEMFRegistration();
```


----------



## guest--asking (12. Sep 2010)

Thema erledigt!!!!! Habs jetzt!!!


----------

