Serialisierung / Deserialisierung von XML mittels EMF

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo

Ich habe beim Einlesen einer Datei mittels EMF, welche wir zuvor auch über EMF rausgeschrieben haben, dass einige Elemente nach dem Einlesen nicht mehr vorhanden sind. Dabei nutzen wir zur Generierung unserer Modellklassen eine xsd mit folgender Struktur (Ausschnitt):

Code:
<xs:element name="Exp">
		<xs:complexType>
			<xs:sequence>
				<xs:choice>
					***<xs:element name="Value" type="RuleValue"/>***
					<xs:element ref="Exp"/>
				</xs:choice>
				<xs:element name="Operator" type="Operator"/>
				<xs:choice minOccurs="0">
					<xs:element name="Value" type="RuleValue"/>
					<xs:element ref="Exp"/>
				</xs:choice>
				<xs:element name="DateRange" type="DateRange" minOccurs="0"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:string" use="optional"/>
			</xs:complexType>
	</xs:element>

Beim Serialisieren dieser Struktur läuft alles nach Plan, d.h. die angelegten Elemente werden alle mit rausgeschrieben, beim Einlesen fallen jedoch alle Elemente, welche in der oben mit *** hervorgehobenen markierten Zeile definiert sind, raus.

Wir laden unsere Ressourcen mit folgendem Aufruf:

Code:
ResourceSet resourceSet = new ResourceSetImpl();
		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
				.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
						new XXXResourceFactoryImpl());

		resourceSet.getPackageRegistry().put(XXXPackage.eNS_URI,
				XXXPackage.eINSTANCE);

		URI uri = URI.createURI(fileName);
		Resource resource = null;
		
		try {
			resource = resourceSet.getResource(uri, true);
		
		}catch (WrappedException we) {
			//unwichtig
		}

Das Speichern erfolgt durch:

Code:
ResourceSet resourceSet = new ResourceSetImpl();


		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
				.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
						new XXXResourceFactoryImpl());

		resourceSet.getPackageRegistry().put(XXXPackage.eNS_URI,
				XXXPackage.eINSTANCE);


                                Resource resource = resourceSet.createResource(URI
				.createFileURI(PATH));

		resource.getContents().add(documentRoot); // documentRoot = wurzelknoten des Baumes

                                Map options = new HashMap();
		
		options.put(XMLResource.OPTION_SKIP_ESCAPE, Boolean.TRUE);
		resource.save(new FileOutputStream(new File(fileName)), options);

Das tatsächliche XML, welches wir lesen wollen, sieht so aus:

Code:
<Exp name="expName">
          ***<Value dataType="para"><![CDATA["paraName"]]></Value>***
          <Operator><![CDATA[CONTAINS]]></Operator>
          <Value dataType="list"><ValueList>
              <Value dataType="string"><![CDATA[moeglich]]></Value>
            </ValueList></Value>
        </Exp>

Das nach dem Einlesen fehlende Element ist wieder hervorgehoben. Wir verwenden EMF-Version 2.2.2. Wir vermuten, dass wir entweder die Lese- oder Schreiboptionen konfigurieren müssen, aber kommen an der Stelle nicht weiter. Google hat leider nicht helfen können, und auch die Boardsuche hat keine Ergebnisse gebracht. Schon mal vielen Dank im Voraus für eure Mühe...
 

Wildcard

Top Contributor
Ist bei mir schon etwa her, aber ich meine mich zu erinnern das es probleme mit dem xsd:choice element gibt.
Hier würde ich eine substitution group versuchen.
 
G

Gast

Gast
Vielen Dank für die schnelle Antwort.

Wir werden das mit der substitutionGroup testen, alternativ werden wir testen, was passiert, wenn wir das andere Element aus der xs:choice ganz rausnehmen und nur das

***<xs:element name="Value" type="RuleValue"/>***

an der Stelle drin lassen. So könnten wir schon mal sehen, ob es ein Problem des Elements an sich ist, oder ob es wirklich an der xs:choice liegt. Werde mich nochmal melden, wenn wir was rausgefunden haben...
 

Wildcard

Top Contributor
Ich hab nochmal drüber nachgedacht.
Ich hatte vor einiger Zeit (ca. 1,5 Jahre her) das Problem das EMF die Exklusivität der Choice nicht umsetzen konnte.
Soll heißen, ein choice A,B wurde im EMF Model so umgesetzt das es eine setA und eine setB Methode gab, ein Element also beide gleichzeitig besitzen konnte.
Ed Merks, der (sehr hilfsbereite) Leiter des EMF Projekts gab mir damals den Tipp die Substitution Group statt der Choice zu verwenden bis sie das Problem in den Griff bekommen haben.
Selbst wenn dieses Problem also noch aktuell ist, kann es mit eurem Problem nicht direkt zusammenhängen.
Wenn es allerdings noch aktuell ist, solltet ihr in jedem Fall die substitution Group verwenden und mit etwas Glück erledigt sich das eigentliche Problem gleich mit.
 
G

Gast

Gast
Hallo

Wir haben das Problem gefunden: In der xsd von meinem ersten Post oben haben die CxValue-Werte in Zeile 6 und Zeile 11 den gleichen Namen, daher hat EMF wohl beim Einlesen den ersten Wert mit dem Zweiten überschrieben. Wir haben die xsd in Zeiel 11 abgeändert, seitdem klappt es mit dem Lesen.

Dank nochmal an Wildcard für die Anregungen...
 
G

Gast

Gast
Die Value-Werte hatten den gleichen Namen, nicht die CxValue-Werte...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben