Hallo,
ich soll aus bestehenden xml-Files etwas herauslöschen. Zur Zeit sieht ein beliebiger Knoten so aus:
<Knoten
Name="bla"
weiteresAttribut="fu"
undNochEinWeiteresAttribut="blubber"
/>
Nach dem ich mit XmlNode.Remove() ein bissl gelöscht habe und dann mit XmlDocument.Save() speicher sieht der gleiche Knoten folgendermaßen aus:
<KnotenName="bla" weiteresAttribut="fu" undNochEinWeiteresAttribut="blubber"/>
syntaktisch richtig. Aber jetzt ist es unmöglich mit Windiff die Änderungen zu kontrollieren.
Der Code:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(file.FullName);
//mache was mit dem xmlDoc...
xmlDoc.PreserveWhitespace = false;
xmlDoc.Save(file.FullName);
Hat jemand eine Idee wie ich meine neuen XML-Files in dem gegebenen Format erstelle?
Mir ist noch etwas eingefallen:
ich habe den Spaß einfach umgedreht. Mit XmlDocument.Normalize() bekomme ich die Originaldateien in mein Format.
Ist zwar nicht so günstig, aber für mich zum checken reicht es erstmal.
Wenn trotzdem noch einer eine Idee hat wie ich meine dateien in das Originalformat bekomme wäre das natürlich ideal.
Windiff handelt völlig korrekt. Windiff hat den Zweck Textänderungen zu erkennen.
Demzufolge liefern Umbrüche Treffer.
es gibt andere Tools die für XML ausgelegt sind.
Tipp: Google, Stichworte XML und Diff.
Die Sache mit dem Format hab ich nicht verstanden. Entweder kann ich die Sätze nicht verstehen, wegen Gehirndefekt, oder die sind unverständlich formuliert(mit einem gehobenen Informationsdefizit).
Wie war das noch gleich mit den Whitespaces? Wie war das mit dem Orginalformat?
Ich hab irgenwas mit Bahnhof... 😉
Nimm doch statt xmldocument.Save(...) xmldocument.WriteTo(...). Beispiel
XmlWriterSettings xWriteSett = new XmlWriterSettings();
xWriteSett.Indent = true;
xWriteSett.IndentChars = " ";
[color]xWriteSett.NewLineOnAttributes = true;[/COLOR]
XmlWriter xWriter = XmlWriter.Create("Meine Datei.xml", xWriteSett);
xmDoc.Save(xWriter);
xWriter.CLose();
Dann solltest du jedes Attribut wieder in einer neuen Zeile haben.
danke kleines_eichhoernchen!
👍 👍
genau das habe ich gesucht
mfg MasterOfDesaster
Bitte Bitte.
Vllt. noch ein kleiner Tip. Gib bei xWriterSett.Encoding = Encoding.UTF8 an, sonst wird automatisch "WIndows1252" oder so genommen. Dort hast du beim Austausch mit andren Betriebssystemen oft Probleme.
Hey ho,
weiß vlt. noch einer wie ich es hinbekomme das, dass EndeTag auf eine neue Zeile kommt?
Ich habe jetzt
xWriteSett.NewLineHandling = NewLineHandling.None;
angewählt gehabt aber er verändert es trotzdem X(
Nach langen google (und co) Sessions ahbe ich mehrere Foreneinträge gefunden die die selben Probleme haben. Aber nirgendwo ist eine Antwort dazu. X(
Weiß wirklich keiner Bescheid???
Mein nächster Ansatz wäre jetzt über Regex die EndeTags rauskriegen und davor ein '\n' zimmern, das ist aber nur ne Notlösung.
Also jetzt rückt schon raus mit den geheimen Tipps 😉
mfg MasterOfDesaster
Ich würde an deiner Stelle (das einzigste "Gescheite" was mir einfällt), eine Klasse erstellen, die von XmlTextWriter erbt und die entsprechenden Funktionen überschreibt. Habe gesehen, diese sind alle override-Markiert
Danke, das werde ich mal probieren morgen.
Ich berichte dann...
Du müsstest die Funktionen überladen die von XmlWriter (Die Basisklasse von XmlTextWriter) als abstrakt definiert sind
Also ich gebe hier mal meine Erfahrungen weiter:
ich habe ein Klasse von XmlTextWriter abgeleitet.
Ich habe mir nur ein paar Methoden überladen:
WriteEndElement
WriteFullEndElement
Damit habe ich dann die Newlines hinbekommen.
Allerdings zwei Probleme:
Die Einrückung war an den Stellen hinüber (hätte ich nachbearbeiten können)
XmlTextWriter hat bei dem Property Settings nur get implementiert.
Dadurch ging mein NewLineOnAttribut wieder verloren.
Also habe ich noch versucht die Methode
WriteAttributes
zu überschreiben, da geht er aber nie rein.
Kann sein das ich das falsche überlade, aber ich glaube auch das es doch noch eine andere Möglichkeit geben muss. MS macht es doch auch 🤔
Überschreib die Funktionen aus XmlWriter(der Basisklasse von XmlTextWriter)
public abstract void WriteStartAttribute(string prefix, string localName, string ns)
public abstract void WriteEndAttribute()
Dann sollte es gehen. Andere Funktionen wie WriteStartAttribute(string localname) rufen diese Funktionen jeweils nur auf.
Prefix und ns können aber leer bzw. NULL sein
Quellen:
.Net Reflector
Hallo,
also das Problem war nicht das Überschreiben oder sowas, mittlerweile übersteigt der Aufwand jedoch den Nutzen.
Die Einrückungen sind nicht ganz so leicht zu machen wie ich erst dachte.
Aus diesem Grund habe ich dann geschaut (Reflector) wie macht es Microsoft.
Der Versuch den Code zu übernehmen und an den paar Stellen anzupassen scheiterte an viel zu vielen Abhängigkeiten interner Klassen. Wen wunderts auch.
Meine Lösung war jetzt folgende sehr unschöne:
das Studio formatiert das ganze nach seinen Wünschen.
Eine stupide Lösung, die mich nicht zufrieden stellen kann, aber naja.
Ich hoffe jetzt nur das ich nicht doch nochmal dringend die Programmlösung brauche.
Danke auf alle Fälle für deine Unterstützung @kleines_eichhoernchen
mfg MasterOfDesaster
Schade... und ich dachte ich krieg jetzt eine fertige implementierung😉
nein, ich hab mich bis jetzt selbst (nich) nicht rangetraut, weil ich ne vorahnung hatte wie viel aufwand das wird🙂