txt. Datei in xml datei konvertieren

  • Themenstarter Themenstarter guest--asking
  • Beginndatum Beginndatum
G

guest--asking

Gast
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!!!
 
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?
 
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
 
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.
 
hättest du vielleicht einen Ansatz für mich oder ein Code-Beispiel, steh total auf dem Schlauch...
 
Du gehst die Datei durch, wenn du "(objectcontent) [" findest, dann suchst du nach "obj = " links davon steht dann der Name usw.
 
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
 
Du könntest ja die Bereiche abtrennen.
wenn du "objekt" triffst, dann steht weiter der Name und eine Klammer.
Dann setzt du
Code:
int brackets
auf 1 du gehst weiter im text. Bei jedem
Code:
(
erhöhst du die Anzahl um 1, bei jedem
Code:
)
machst du -1. Sobald du bei 0 angekommen ist. ist das Objekt zu Ende. Du hast also die Anfangsposition und die Endposition.
 
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(..)....
 
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:
Java:
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)
 
Zuletzt bearbeitet:
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 .... :-(
 
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?
 
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?
 
Java:
(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?
 
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:
Code:
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:
Java:
	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
 
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
 
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!!!!
 
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.
 
Ich hab dir doch Beispielcode gegeben.
Java:
new YourLanguageNameStandaloneSetup().createInjectorAndDoEMFRegistration();
 

Neue Themen


Zurück
Oben