EMF Modell um alle möglichen Attribute auszulesen

Status
Nicht offen für weitere Antworten.

emftester

Mitglied
Hallo,

ich versuche gerade eben ein EMF Modell zu erstellen,
dass mir eine XML Datei einliest, bei der ich die jeweiligen Attribute nicht wissen kann.

z.B.
<?xml version="1.0" encoding="ASCII"?>
<data xmlns="http://daten" attr1="wert1" attr2="wert3" />

Jetzt habe ich ein EPackage mit einer Klasse Data erstellt.
ExtendedMetaData: name->data

Jetzt weiss ich aber nicht wie ich das Attribut so erstellen soll, dass mit allen Attributen klarkommt.

Ist dies überhaupt möglich?
Ich habe leider nicht allzuviel Erfahrung mit EMF.

Zum Einlesen einer XML benutze ich folgenden Code:
Java:
DataXMLProcessor dataProcessor = new DataXMLProcessor();

		try {
			HashMap options = new HashMap();
			options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
		
			Resource res = dataProcessor.load(new FileInputStream(
					"C:/test.xml"),options);
			dataProcessor.save(new FileOutputStream(
					"c:/test2.xml"), res,
					null);
}....
leider erhalte ich folgende Expception bei der dataProcessor.load anweisung
Caused by: org.eclipse.emf.ecore.xmi.FeatureNotFoundException: Feature 'attr1' not found.

Hat hier vielleicht jmd. eine Ahnung wie ich mein Ecore Modell modellieren soll, damit er mit den verschiedensten Attributen klarkommt.

Ich bin für jede Hilfe sehr dankbar.
 

Wildcard

Top Contributor
Schreib einfach eine XSD die entsprechende Wildcards enthält (zB anyURI). Dann lässt du EMF aus der XSD dein Ecore basteln.
Dir sollte allerdings klar sein das EMF für unstrukturierten Inhalt wenig komfortabel ist. Vielleicht solltest du einfach einen XML Parser verwenden (der zB ein EMF Modell befüllt).
 

emftester

Mitglied
Hallo Wildcard,

vielen dank für deine Antwort.
Ich werde dies gleich ausprobieren.

Mir geht es primär darum eine XML ohne Probleme einzulesen und etwas rausfiltern/bearbeiten und dann die XML wieder zu erstellen. Ich denke dafür gibt es bessere alternativen als emf.
Ich habe nur das Problem, dass ich nur ca. 10% unstrukturierten Code habe bzw. in diesen 10% kann die Struktur komplett anders ausschauen. Ich möchte die einfach in mein Ecore Model einlesen können und auch nicht wirklich weiter behandeln. Es sollen nur bekannte Teile des Ecore Modell bearbeitet werden.
Wenn ich diese 10% aus der XML lösche, kann ich die XML ohne Probleme lesen, aber sobald der unstrukturierte/variable Teil reinkommt erhalte ich die obige Exception.
 

emftester

Mitglied
Also ich habe das jetztausprobiert und es funktioniert sehr schön.
Mit folgendem Ecore kann man sehr gut, alle möglichen XML eines Namespaces lesen:

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="Data"
nsURI="http://data nsPrefix="">
<eClassifiers xsi:type="ecore:EClass" name="Data">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="name" value="data"/>
</eAnnotations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="anyAttribute" unique="false"
upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="attributeWildcard"/>
<details key="name" value=":1"/>
<details key="wildcards" value="##any"/>
<details key="processing" value="lax"/>
</eAnnotations>
</eStructuralFeatures>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="anyElement" upperBound="-1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="elementWildcard"/>
<details key="name" value=":0"/>
<details key="wildcards" value="##any"/>
<details key="processing" value="lax"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
</ecore:EPackage>
 

Wildcard

Top Contributor
Genau so meinte ich das. Du kannst auf diese zustätzlichen Elemente und Attribute sogar über die FeatureMap zugreifen.
 

emftester

Mitglied
ich hätte noch eine Frage: Ist es irgendwie möglich mit einem Modell wie dem obigen mehrere unbekannte Namespaces zu lesen.

Ich habe hier eine XML Datei, die teilweise xmlns Einträge enthält dessen Namespace ich nicht kenne.
Kann man dem Ecore Modell sagen, dass er unbekannte Namespaces ignorieren bzw. einfach nur normal einlesen soll?

Vielen Dank schon mal für deine Hilfe
 

Wildcard

Top Contributor
Meinst du nun das irgendwo mit xmlns Namespaces deklariert werden die du nicht kennst, oder das Präfixe verwendet wurden die nicht deklariert wurden?
Für ersteren Fall müsstest du wohl einen eigenen Resolver platzieren der unbekannte Namespaces durchwinkt, für letzteren Fall den Parser toleranter einstellen (denn das ist eigentlich ein Fehler).
Wie du das nun genau im Code ausdrücken musst kann ich dir aus dem Stehgreif nicht sagen, befrag dazu am besten die EMF Hilfe, oder schau in die Newsgroup.
 

emftester

Mitglied
Hallo,

ich meine die erste Variante. Das Stichwort Resolver hat mir gefehlt.
Werde mich morgen damit näher auseinandersetzen.
Danke schön für deine Hilfe.
 

emftester

Mitglied
Hallo wildcard,

hast du evtl. einen guten Link zu einem Tutorial oder Code Beispiel, wie man so einen Resolver erstellt bzw. benutzt.
Ich finde da leider nichts Gutes zu.
 

Wildcard

Top Contributor
Ich habe nochmal nachgelesen:
Du bekommst wahrscheinlich eine FeatureNotFoundException?
Diese Exceptions werden beim Parsen aufgezeichnet und am Ende ausgegeben.
Das Modell wird allerdings trotzdem geladen, also musst du diese Exception einfach ignorieren.
Wenn du die Elemente von unbekannten Namespaces behalten willst, kannst du diese Load Option auf true setzen:
XMLResource.OPTION_RECORD_UNKNOWN_FEATURES
 

emftester

Mitglied
Ah okay, danke, das werde ich gleich mal testen.
diese FeatureNotFoundException habe ich schon öfters gesehen ;-)
 

emftester

Mitglied
Ich habe es jetzt mit der Option probiert. Es funktioniert jetzt eigentlich genauso wie ich es mir vorgestellt habe.
Danke schön für deine schnelle Hilfe.

Ich habe jetzt eigentlich nur noch ein Problem. Ich erhalte folgende XML Ausgabe:
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="http://mydata"
xmlns:mydata2="http://mydata2">
<mydata2:tests>
<mydata2:test id="1" />
<mydata2:test id="2" />
<mydata2:test id="3" />
<mydata2:test id="4" />
</mydata2:tests>
</data>

Mir persönlich wäre aber folgende Ausgabe lieber:
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="http://mydata">
<tests xmlns="http://mydata2">
<test id="1" />
<test id="2" />
<test id="3" />
<test id="4" />
</tests>
</data>

Kann man dies evtl. durch irgendeine Options einstellen?
Ich habe da nichts sinnvolles gefunden unter XMLResource.
 

emftester

Mitglied
habe es jetzt doch geschafft, das Ergebnis wie wie gewünscht abzuspeichern
XMLResource.OPTION_RECORD_ANY_TYPE_NAMESPACE_DECLARATIONS
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben