# EMF Modell um alle möglichen Attribute auszulesen



## emftester (29. Jul 2009)

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:

```
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 (29. Jul 2009)

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 (29. Jul 2009)

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 (30. Jul 2009)

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 (30. Jul 2009)

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


----------



## emftester (5. Aug 2009)

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 (5. Aug 2009)

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 (5. Aug 2009)

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 (8. Aug 2009)

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 (8. Aug 2009)

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 (8. Aug 2009)

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


----------



## emftester (8. Aug 2009)

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 (9. Aug 2009)

habe es jetzt doch geschafft, das Ergebnis wie wie gewünscht abzuspeichern
XMLResource.OPTION_RECORD_ANY_TYPE_NAMESPACE_DECLARATIONS


----------

