# dom4j Kommentare



## triple (6. Mrz 2009)

Hallo miteinander,

ich muss eine XML Datei auslesen und weiterverarbeiten.

Das auslesen / schreiben ist kein Problem, der Knackpunkt liegt anderswo:

Ich muss gewisse Teile des XML-Files "ausklammern" können, also die Elemente sollten trotzdem im XML aktiv stehen, jedoch nachher nicht weiterverarbeitet werden.

Beispiel:

[highlight=XML]<gruppe>

<person id="1">
<name>Muster</name>
<vorname>Hans</vorname>
</person>

<!-- beginn manual -->
<person id="2">
 <name>Meier</name>
 <vorname>Peter</vorname>
 </person>
<!-- end manual -->

<person id="3">
 <name>Müller</name>
 <vorname>Sepp</vorname>
 </person>

</gruppe>[/highlight]

nun sollte danach Person 1 und 3 mit dem Programm verarbeitet werden, jedoch Person 2 nicht.
Jemand eine Idee wie ich die Kommentare gut auslesen kann? Auch wenn jemand einen anderen Lösungsansatz weiss, bin immer offen für Ideen und Inspirationen.

Danke für die Hilfe,
gruss triple


----------



## Noctarius (6. Mrz 2009)

```
<!-- beginn manual
<person id="2">
 <name>Meier</name>
 <vorname>Peter</vorname>
 </person>
 -->
```


----------



## triple (6. Mrz 2009)

so eifach ist es (leider) nicht, ich muss die Daten zwar in die Applikation laden, aber einfach nicht weiterverarbeiten, auch ins output.xml müssen sie wieder mit diesen Kommentaren rein.

Es geht einfach darum, ein XML file zu verarbeiten, wobei ich überall einen "Sonderfall" markieren kann, welcher mit der Applikation nicht verarbeitet werden kann, aber trotzdem funktioniert, also auskommentieren fällt weg, das heisst im Beispiel oben muss Person 2 noch verwendet werden können von anderen Programmen.


----------



## mvitz (6. Mrz 2009)

Noctarius hat gesagt.:


> ```
> <!-- beginn manual
> <person id="2">
> <name>Meier</name>
> ...



:toll:

Die Idee ist echt gut. ^^ Und vor allem Simpel!

[Edit] Wie wäre es mit einem zusätzlichem Attribut oder Child?


----------



## Noctarius (6. Mrz 2009)

wie wäre es nen Attribute "use" zu machen und dann folgendes Konstrukt zu verwenden: <person id="2" use="false">


edit: Alternative ->
Datei einlesen, Werte verändern, speichern (aber eben nicht in eine neue Datei)


----------



## triple (6. Mrz 2009)

die Idee ist gar nicht mal so schlecht...

ich muss jedoch zuerst abklären, ob unsere Applikation noch mit der XML zurechtkommt und ob wir eine Vorlage oder so was haben.

Das ist halt das Problem, kann nicht alles so anpassen wie ich es will, aber wenns geht wär die Lösung genial...


----------



## Noctarius (6. Mrz 2009)

Im schlimmsten Fall wäre das Attribute ins DTD oder XSD einzutragen (oder welches Schemaformat auch immer Ihr benutzt). Für andere Anwendungen sollte es keinen Unterschied machen, da diese das Attribute ziemlich sicher einfach ignorieren (da es für sie nicht "existiert")


----------



## Noctarius (6. Mrz 2009)

habi55 hat gesagt.:


> :toll:
> 
> Die Idee ist echt gut. ^^ Und vor allem Simpel!
> 
> [Edit] Wie wäre es mit einem zusätzlichem Attribut oder Child?



Ich war schneller


----------



## mvitz (6. Mrz 2009)

Jo, auch wenn wir wohl gleichzeitig getippt haben


----------



## Noctarius (6. Mrz 2009)

triple hat gesagt.:


> die Idee ist gar nicht mal so schlecht...
> 
> ich muss jedoch zuerst abklären, ob unsere Applikation noch mit der XML zurechtkommt und ob wir eine Vorlage oder so was haben.
> 
> Das ist halt das Problem, kann nicht alles so anpassen wie ich es will, aber wenns geht wär die Lösung genial...



Sonst als allerletzte Idee bleibt nur den DOM selber parsen mit Document und dann bekommst du die Kommentarzeilen als #TEXT Objekte welche du, am besten mit einer speziellen Einleitungskennung (z.B. "<!-- //UNUSED --> ... <!-- UNUSED// -->") versiehst und so filtern kannst. Diese Lösung ist aber wieder mal absolut unschön. 

Ein neues Attribute macht es sauber, einfach und funktionell und sollte auch für jeden Anderen / Neuen sofort verständlich sein.


----------



## maki (6. Mrz 2009)

Hab es zwar nicht probiert, aber laut Doku liest der org.dom4j.io.SAXReader auch Kommentare wenn man ihm das sagt (setIgnoreComments) und der XMLWriter kann Kommentare schreiben.


----------



## Noctarius (6. Mrz 2009)

Echt der ließt die Kommentare auch? - Wusst ich nicht *pfeiff*

Trotzdem ist die Attribute-Sache schöner *fest von überzeugt ist*


----------



## mvitz (6. Mrz 2009)

Muss ich Noctarius zustimmen.


----------



## triple (6. Mrz 2009)

also, das Problem ist, dass das DTD vom Framework geliefert wird, auf dieses habe ich keinen Einfluss, deshalb müssen es wohl die Kommentare tun.

Danke für den Tipp mit setIgnoreComments, werde ich gleich ausprobieren.


----------



## maki (6. Mrz 2009)

Noctarius hat gesagt.:


> Echt der ließt die Kommentare auch? - Wusst ich nicht *pfeiff*
> 
> Trotzdem ist die Attribute-Sache schöner *fest von überzeugt ist*


Hast natürlich recht.

Wenn Kommentare(="wertloser" text) eigentlich keine sind, sollte man sie am besten auch nicht so behandeln.


----------



## triple (6. Mrz 2009)

maki hat gesagt.:


> Wenn Kommentare(="wertloser" text) eigentlich keine sind, sollte man sie am besten auch nicht so behandeln.




ich würds gerne auf eine andere Weise lösen, aber da ich das DTD nicht bearbeiten kann und die Applikation in Zukunft Problemlos lauffen muss (kann sein dass das Framework das DTD ändert oder so) sind die Kommentare wohl die Sicherste Variante, weil die immer erlaubt sind


----------



## maki (6. Mrz 2009)

Natürlich meinte ich mit "am besten" nur wenn es möglich ist


----------



## Noctarius (6. Mrz 2009)

Btw:
wäre es nicht schöner den Kommentar als erstes Element innerhalb von <Person/> zu halten?

Sobald du einen Kommentar in Person findest markierst du dieses Objekt intern als "Nicht zu verarbeiten"


```
<person id="2">
   <!-- UNUSED -->
   <name>Meier</name>
   <vorname>Peter</vorname>
</person>
```


----------
Was kurzes Nachdenken in der Mittagspause doch alles hervorzaubert 
----------

edit:
Nein DTD's kann man nicht "ableiten" soweit ich das weiß


----------



## triple (6. Mrz 2009)

das war mir klar, würde lieber die kommentare weg lassen, aber die Situation (DTD nicht veränderbar) kombiniert mit meinem Wissen über XML lässt mir irgendwie keine Möglichkeit mehr, oder hat noch jemand eine idee?


----------



## triple (6. Mrz 2009)

Noctarius hat gesagt.:


> Btw:
> wäre es nicht schöner den Kommentar als erstes Element innerhalb von <Person/> zu halten?



Das wird wohl so gemacht werden müssen, ich würds schöner finden wenn ich gleich ein paar personen gleichzeitig ausklammern kann, also vor person 1 beginnen (<!-- Unused - Start--> und nach Person 3 aufhören (<!-- Unused - End-->) oder so was, dass ich nicht jede Person ausklammern muss, aber das wird wohl doch die beste Lösung sein, ansonsten wird es reichlich kompliziert.


----------



## Noctarius (6. Mrz 2009)

Noch eine Alternative *voll mit Ideen ist heute*

Nimm ne extra Datei und speicher dort die nicht zu benutzenden Personen ab, da scheinbar außer dir ja keiner die Information braucht / will


----------



## triple (6. Mrz 2009)

auch keine schlechte idee, jedoch muss bei jedem load eines Files dieses zu verarbeitet werden, und zwar zu 100% dem File-Inhalt entsprechend, das heisst das XML File kann auch woanders bearbeitet werden, und ich muss es wieder korrekt lesen können (ich weiss, meine Situation ist relativ schwierig.)

darum funktioniert das nicht, wenn ich person 2 "ausklammere", das file wird woanders geändert und von nun an muss person 2 trotzdem berücksichtigt werden, dazu müsste jeder, der das XML File bearbeitet meine Speicherdatei updaten.

Danke für die Hilfe, Gute Idee aber bei mir leider nicht umsetzbar.


----------



## Noctarius (6. Mrz 2009)

Wieso geht das nicht (denk dran, der Andere muss deine Kommentare auch wieder mitspeichern - werden die Meisten wohl nicht tun)

Datei1 - Personen.xml:

```
<persons>
	<person id="1"> ... </person>
	<person id="2"> ... </person>
	<person id="3"> ... </person>
	<person id="4"> ... </person>
	<person id="5"> ... </person>
</persons>
```

Datei2 - unused.xml:

```
<persons>
	<person id="1" />
	<person id="3" />
</persons>
```

Alle ReferenzIds aus File 2 werden eben nicht verarbeitet. Diese Datei (da auf Ids basierend) kannst du ohne Probleme über mehrere Updates der Personen.xml beibehalten (Voraussetzung: Die Id ändert sich nicht)


----------



## triple (6. Mrz 2009)

Noctarius hat gesagt.:


> Wieso geht das nicht (denk dran, der Andere muss deine Kommentare auch wieder mitspeichern - werden die Meisten wohl nicht tun)



Die Kommentare würden ja bleiben, die schreibe ich auch wieder raus, d.h. wer eine neue Person hinzufügt und weiss, sie ist ein Sonderfall, kann den Kommentar rein tun.

Wenn aber eine "normale" Person (ohne Sonderbehandlung) hinzugefügt wird, brauchts ja keinen Kommentar, darum mache ich mir keine Sorgen, es werden eh nur Erfahrene Entwickler die Datei manuell bearbeiten, und diese sollten dann wissen was sie machen.

Aber jedes mal updaten wenn irgendwer im betrieb eine Änderung vornimmt? geht leider gottes einfach nicht


----------



## Noctarius (6. Mrz 2009)

> es werden eh nur Erfahrene Entwickler die Datei manuell bearbeiten, und diese sollten dann wissen was sie machen.



Wie SICHER bist du dir, dass nicht irgendeiner der erfahrenen Entwickler sich das Leben einfach gemacht hat (naturgemäß sind Programmierer faul - ich auch ) und ein Programm gebastelt hat zum automatischen verarbeiten / anfügen von Datensätzen?

Ich sag nur einmal JAXB (z.B.) und deine Kommentare sind weg


----------



## triple (6. Mrz 2009)

das liegt aufgrund der Problemstellung auf der Hand, ok, ich habe natürlich das Problem nie genau erklärt, mein Fehler. Also, kurz:

Wir (Portal-Anwendung) managen mit einem XML File diverse Sachen wie z.B. links.
Dies ist für frontend-entwickler relativ mühsam, die Daten vom Business ins XML umzuschreiben, weil Zeitaufwändig.

Nun soll eine neue Applikation geschaffen werden, welche es den Business-leuten direkt erlaubt, über ein GUI die Daten einzugeben, und die applikation erstellt das XML file.

Das heisst jedes mal, wenn ein Change gemacht wird, wird das File, welches im moment "produktiv" ist, kopiert, und in das Programm geladen, die Änderungen per GUI angepasst, gespeichert, und in die Produktive umgebung geschoben (ganz grober ablauf).

Nun, theoretisch würde das XML - File nie von Hand bearbeitet werden müssen, da aber Sonderfälle existieren, welche sich nicht, sicherlich nicht in der ersten Phase, automatisieren lassen. Für diese Fälle müsste dann jemand, der sich damit auskennt, diese Änderungen von Hand machen gehen (neuer eintrag) und dann die neuen / geänderten Objekte kennzeichnen. Alle anderen Objekte werden dabei nicht berührt.


Ich persönlich sehe da kein Problem, aber ich glaube das liegt eher daran, dass mir nicht ganz klar ist, auf was du hinaus willst mit Faulheit, aus meiner Sicht ist alles andere als kurz die Changes von Hand durchzuführen mehr Arbeit...


----------



## triple (6. Mrz 2009)

noch eine Frage,

habe mit setIgnoreComments(false) die Kommentare angeschaltet, diese werden beim schreiben des gleichen Documents auch wieder ausgeschrieben, nur kann ich nicht auf den Kommentar selber zugreifen, finde ihn in keiner get-methode

[highlight=Java]
Element temp = i.next();
System.out.println("Text: " + temp.getText());
System.out.println("Data: " + temp.getData());
System.out.println("Name: " + temp.getName());
System.out.println("Parent: " + temp.getParent());
System.out.println("Path: " + temp.getPath());
System.out.println("String value: " + temp.getStringValue());
System.out.println("Namespace: " + temp.getNamespace());[/highlight]

kann mir einer sagen wie ich den Kommentar auslesen kann?

Danke & gruss


----------



## Noctarius (6. Mrz 2009)

Der Kommentar müsste ein eigenes Element innerhalb vom person-Tag sein und zwar vom Typ #Text oder sowas


----------

