dom4j Kommentare

Status
Nicht offen für weitere Antworten.

triple

Mitglied
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

Top Contributor
Code:
<!-- beginn manual
<person id="2">
 <name>Meier</name>
 <vorname>Peter</vorname>
 </person>
 -->
 

triple

Mitglied
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.
 

Noctarius

Top Contributor
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)
 
Zuletzt bearbeitet:

triple

Mitglied
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

Top Contributor
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

Top Contributor
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.
 
M

maki

Gast
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

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

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

triple

Mitglied
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.
 

triple

Mitglied
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
 
M

maki

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

Noctarius

Top Contributor
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"

Code:
<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ß
 
Zuletzt bearbeitet:

triple

Mitglied
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

Mitglied
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

Top Contributor
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

Mitglied
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

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

Datei1 - Personen.xml:
Code:
<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:
Code:
<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

Mitglied
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

Top Contributor
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

Mitglied
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

Mitglied
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

Top Contributor
Der Kommentar müsste ein eigenes Element innerhalb vom person-Tag sein und zwar vom Typ #Text oder sowas
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben