Benutzer mit den meisten Antworten
XmlDeclaration beim Schreiben unterdrücken

Frage
-
Hallo,
brauche wieder mal eure Hilfe. Ich schnalls einfach nicht.
Ich muss in einem XML-Dokument einige Knoten ersetzen. In 10 Minuten hatte ichs raus.
Dim xdoc As XElement = XElement.Load("data.xml") xdoc.Element("messreihen").Elements.Remove xdoc.Element("messreihen").ReplaceNodes(neue_messreihen.Elements) xdoc.Save("datacopy.xml")
Die vorhandenen Messreihen habe ich damit durch neue ersetzt. Das klappte auf Anhieb. Leider wird beim Speichern oben am Document die XmlDeclaration mitgeschrieben. Und die mag das Fremdprogramm, in das die Xml importiert werden müssen, gar nicht und fliegt mir um die Ohren. Im Netz habe ich viele Beiträge gefunden, wie man das Problem lösen könnte. Ich probiere schon seit Stunden alles aus. Habe unter anderem mit IsolatedStorage experimentiert. Aus meinen 4 Zeilen Code sind schon 30 geworden, aber es funktioniert rein gar nichts. Es sind über 400 XMLs und die Messreihen sind ein riesiger Komplex. Kann mir jemand helfen? Danke!
Gruß Norbert
Antworten
-
<patient class="de.iem.client2.data.IEMPatient" reference="../../.."/>
und im Studio habe ich im xdoc nach dem Load
<patient class="de.iem.client2.data.IEMPatient" reference="../../.." />
also 1 Zeichen mehr.
Hallo Norbert,
hier unsere Lösung, um das Leerzeichen, welches durch den Serializer beim lesen der XML datei entsteht, wieder zu entfernen:
Dim xmlFile As String = "C:\...\...\...\...\data.xml" Dim d = XDocument.Load(xmlFile, LoadOptions.PreserveWhitespace) Dim setting = New XmlWriterSettings With { .OmitXmlDeclaration = True, .Indent = True, .Encoding = Encoding.UTF8, .NewLineChars = vbLf } Dim xml As String Using stream As MemoryStream = New MemoryStream() Using writer = XmlWriter.Create(stream, setting) d.Save(writer) End Using stream.Position = 0 Using reader As StreamReader = New StreamReader(stream) xml = reader.ReadToEnd() End Using End Using Using sw As StreamWriter = New StreamWriter(xmlFile) sw.Write(xml.Replace(" />", "/>")) End Using
Gruß ins schöne Thüringen und weiter viel Erfolg.
Stefan
Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP
- Als Antwort markiert norbert3 Freitag, 19. Oktober 2018 08:32
Alle Antworten
-
Hallo Norbert,
poste doch bitte mal die problematische XML Datei und eine, wie sie aussehen sollte.
Dazu bitte den Code deines Versuchs, die XmlDeclaration zu unterdrücken.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Wenn ich z.B. soetwas mache:
Dim xws As XmlWriterSettings = New XmlWriterSettings xws.OmitXmlDeclaration = True Dim xw As XmlWriter xw = XmlWriter.Create("datacopy.xml", xws) xdoc.Save(xw)
bekomme ich die Xml gar nicht im Editor auf. Es kommt die Fehlermeldung:
XML-Verarbeitungsfehler: Ungeschlossenes Token
Adresse: file:///E:/VisualProjecte/HmsDbTool/HmsDbTool/bin/Debug/Xml/Pat_267.hms/data.xml
Zeile Nr. 1, Spalte 122852 -
Hallo Norbert,
bitte den Inhalt der XML Datei posten. (Einmal die falsche und einmal die manuell korrigierte korrekte Fassung)
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Ihr seid wie immer schnell und klasse!!!
Hab die kleinst XML rausgesucht. Ich muss einige Werte ersetzen (z.B. die Patient-ID) und weitere Messreihen hinzufügen. Das klappt reibungslos. "Falsch" ist die Datei danach eigentlich nicht. Nur wenn ich das veränderte XML abspeichere, wird oben als erste Zeile geschrieben
<?xml version="1.0" encoding="utf-8"?>
<de.iem.client2.data.IEMPatient>
<id>267</id> ...Das darf nicht sein!
------------------------------------------------------------------------------------------------------------------------------------
Oh, Mist, zulang. Ich schneide in der Mitte was raus.
Hier eine Beispiel XML:
<de.iem.client2.data.IEMPatient>
<id>239</id>
<address>
<id>239</id>
<type>PATIENT</type>
<firstname>Matthias</firstname>
<lastname>Ilmer</lastname>
<street>An der Muehle 5</street>
<po>99510</po>
<city>Kapellendorf</city>
<locale>de_DE</locale>
</address>
<size__si>0.0</size__si>
<weight__si>0.0</weight__si>
<sex>Male</sex>
<birthdate class="sql-timestamp" timestamp="415580400000">1983-03-04 00:00:00.000</birthdate>
<patientID>238</patientID>
<raucher>NO</raucher>
<pmStatus>None</pmStatus>
<maritalstatus>LEDIG</maritalstatus>
<status>ACTIVE</status>
<kontaktpersonen class="vector"/>
<medikationen class="vector"/>
<krankheiten class="vector"/>
<selbstmessungenWeight/>
<selbstmessungenBP/>
<measurementGlucos/>
<measurementPeakFlowDatas/>
<measurementSpo2s/>
<measurementsCoagulation/>
<measurementsHbA1c/>
<targetvaluesbp/>
<targetvalueskg/>
<targetvaluesgluco/>
<targetvaluespeakflow/>
<targetvaluesINR/>
<patientFileEntries/>
<lastMesRead class="sql-timestamp" timestamp="1474365291030">2016-09-20 11:54:51.030</lastMesRead>
<bdlimits>
<id>239</id>
<abpmMaxSysDay>140</abpmMaxSysDay>
<abpmMaxDiasDay>90</abpmMaxDiasDay>
<abpmMaxSysNight>125</abpmMaxSysNight>
<abpmMaxDiasNight>80</abpmMaxDiasNight>
<abpmMaxSysTotal>130</abpmMaxSysTotal>
<abpmMaxDiasTotal>80</abpmMaxDiasTotal>
<abpmMaxSysDayAvg>135</abpmMaxSysDayAvg>
<abpmMaxDiasDayAvg>85</abpmMaxDiasDayAvg>
<abpmMaxSysNightAvg>120</abpmMaxSysNightAvg>
<abpmMaxDiasNightAvg>75</abpmMaxDiasNightAvg>
<sbpmMaxSys>135</sbpmMaxSys>
<sbpmMaxDias>85</sbpmMaxDias>
<officeMaxSys>140</officeMaxSys>
<officeMaxDias>90</officeMaxDias>
</bdlimits>
<messreihen>
<de.avetana.data2.entities.Aufzeichnung>
<id>413</id>
<patient class="de.iem.client2.data.IEMPatient" reference="../../.."/>
<measurements>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33201</id>
<kommentar>Manuell</kommentar>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1407997043136">2014-08-14 08:17:23.136</timestamp>
<update class="sql-timestamp" timestamp="1407997043136">2014-08-14 08:17:23.136</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1389170160000">2014-01-08 09:36:00.000</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>100</code>
<hr>90</hr>
<nibpDias>118</nibpDias>
<nibpMAD>147</nibpMAD>
<nibpSys>182</nibpSys>
<seqNum>0</seqNum>
<voltage>2.86</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33202</id>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1407997043136">2014-08-14 08:17:23.136</timestamp>
<update class="sql-timestamp" timestamp="1407997043136">2014-08-14 08:17:23.136</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1389170700000">2014-01-08 09:45:00.000</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>89</hr>
<nibpDias>111</nibpDias>
<nibpMAD>142</nibpMAD>
<nibpSys>179</nibpSys>
<seqNum>0</seqNum>
<voltage>2.86</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33203</id>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1407997043137">2014-08-14 08:17:23.137</timestamp>
<update class="sql-timestamp" timestamp="1407997043137">2014-08-14 08:17:23.137</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1389171600000">2014-01-08 10:00:00.000</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>87</hr>
<nibpDias>103</nibpDias>
<nibpMAD>137</nibpMAD>
<nibpSys>179</nibpSys>
<seqNum>0</seqNum>
<voltage>2.86</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33204</id>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1407997043137">2014-08-14 08:17:23.137</timestamp>
<update class="sql-timestamp" timestamp="1407997043137">2014-08-14 08:17:23.137</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1389172500000">2014-01-08 10:15:00.000</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>85</hr>
<nibpDias>101</nibpDias>
<nibpMAD>133</nibpMAD>
<nibpSys>172</nibpSys>
<seqNum>0</seqNum>
<voltage>2.86</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33205</id>
<kommentar>Fehlmessung (E3)</kommentar>
<deactivated>true</deactivated>
<timestamp class="sql-timestamp" timestamp="1407997043137">2014-08-14 08:17:23.137</timestamp>
<update class="sql-timestamp" timestamp="1407997043137">2014-08-14 08:17:23.137</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1389173580000">2014-01-08 10:33:00.000</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>3</code>
<hr>999</hr>
<nibpDias>999</nibpDias>
<nibpMAD>999</nibpMAD>
<nibpSys>999</nibpSys>
<seqNum>0</seqNum>
<voltage>2.84</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33206</id>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1407997043137">2014-08-14 08:17:23.137</timestamp>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>88</hr>
<nibpDias>109</nibpDias>
<nibpMAD>119</nibpMAD>
<nibpSys>130</nibpSys>
<seqNum>0</seqNum>
<voltage>3.06</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33357</id>
<serialnumber>C22211</serialnumber>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291138">2016-09-20 11:54:51.138</timestamp>
<update class="sql-timestamp" timestamp="1474365291138">2016-09-20 11:54:51.138</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474277631020">2016-09-19 11:33:51.020</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>81</hr>
<nibpDias>90</nibpDias>
<nibpMAD>100</nibpMAD>
<nibpSys>112</nibpSys>
<seqNum>0</seqNum>
<voltage>3.04</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33358</id>
<serialnumber>C22211</serialnumber>
<kommentar>Bewegungsartefakt</kommentar>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291143">2016-09-20 11:54:51.143</timestamp>
<update class="sql-timestamp" timestamp="1474365291143">2016-09-20 11:54:51.143</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474278531020">2016-09-19 11:48:51.020</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>2</code>
<hr>0</hr>
<nibpDias>0</nibpDias>
<nibpMAD>0</nibpMAD>
<nibpSys>0</nibpSys>
<seqNum>0</seqNum>
<voltage>3.04</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33359</id>
<serialnumber>C22211</serialnumber>
<kommentar>Druckanstieg beim Entlüften. Bewegung?</kommentar>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291148">2016-09-20 11:54:51.148</timestamp>
<update class="sql-timestamp" timestamp="1474365291148">2016-09-20 11:54:51.148</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474279431020">2016-09-19 12:03:51.020</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>2</code>
<hr>0</hr>
<nibpDias>0</nibpDias>
<nibpMAD>0</nibpMAD>
<nibpSys>0</nibpSys>
<seqNum>0</seqNum>
<voltage>3.04</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33360</id>
<serialnumber>C22211</serialnumber>
<kommentar>Bewegungsartefakt</kommentar>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291153">2016-09-20 11:54:51.153</timestamp>
<update class="sql-timestamp" timestamp="1474365291153">2016-09-20 11:54:51.153</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474280331020">2016-09-19 12:18:51.020</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>2</code>
<hr>0</hr>
<nibpDias>0</nibpDias>
<nibpMAD>0</nibpMAD>
<nibpSys>0</nibpSys>
<seqNum>0</seqNum>
<voltage>3.02</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33361</id>
<serialnumber>C22211</serialnumber>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291158">2016-09-20 11:54:51.158</timestamp>
<update class="sql-timestamp" timestamp="1474365291158">2016-09-20 11:54:51.158</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474281051020">2016-09-19 12:30:51.020</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>97</hr>
<nibpDias>114</nibpDias>
<nibpMAD>144</nibpMAD>
<nibpSys>180</nibpSys>
<seqNum>0</seqNum>
<voltage>3.0</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33362</id>
<serialnumber>C22211</serialnumber>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291160">2016-09-20 11:54:51.160</timestamp>
<update class="sql-timestamp" timestamp="1474365291160">2016-09-20 11:54:51.160</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474281951021">2016-09-19 12:45:51.021</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>79</hr>
<nibpDias>93</nibpDias>
<nibpMAD>124</nibpMAD>
<nibpSys>160</nibpSys>
<seqNum>0</seqNum>
<voltage>3.0</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33363</id>
<serialnumber>C22211</serialnumber>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291163">2016-09-20 11:54:51.163</timestamp>
<update class="sql-timestamp" timestamp="1474365291163">2016-09-20 11:54:51.163</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474282851021">2016-09-19 13:00:51.021</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>86</hr>
<nibpDias>95</nibpDias>
<nibpMAD>134</nibpMAD>
<nibpSys>180</nibpSys>
<seqNum>0</seqNum>
<voltage>3.0</voltage>
</de.avetana.data2.entities.MeasurementBP>
<de.avetana.data2.entities.MeasurementBP>
<alarm>false</alarm>
<id>33364</id>
<serialnumber>C22211</serialnumber>
<deactivated>false</deactivated>
<timestamp class="sql-timestamp" timestamp="1474365291166">2016-09-20 11:54:51.166</timestamp>
<update class="sql-timestamp" timestamp="1474365291166">2016-09-20 11:54:51.166</update>
<timeOfMeasurement class="sql-timestamp" timestamp="1474283751021">2016-09-19 13:15:51.021</timeOfMeasurement>
<mesType>AUTOMATIC_MEASUREMENT</mesType>
<deviceType>NIBPMONITOR</deviceType>
<arrhythmiaFlag>false</arrhythmiaFlag>
<aufzeichnung reference="../../.."/>
<code>0</code>
<hr>82</hr>
<nibpDias>95</nibpDias>
<nibpMAD>125</nibpMAD>
<nibpSys>160</nibpSys>
<seqNum>0</seqNum>
<voltage>3.0</voltage>
</de.avetana.data2.entities.MeasurementBP>
</measurements>
<timestamp class="sql-timestamp" timestamp="1474273131017">2016-09-19 10:18:51.017</timestamp>
<dayStart>600</dayStart>
<nightStart>2200</nightStart>
<protocolDayStart>600</protocolDayStart>
<protocolNightStart>2200</protocolNightStart>
<firmware>20</firmware>
<protNum>1</protNum>
<memoVolt>3.027</memoVolt>
<calibDate class="sql-timestamp" timestamp="1427450676022">2015-03-27 11:04:36.022</calibDate>
<importDate class="sql-timestamp" timestamp="1474365291030">2016-09-20 11:54:51.030</importDate>
<protDesc>0|1|1|6,9,4,1|10,12,4,1|13,21,4,1|22,5,2,0|</protDesc>
<sernum>C22211</sernum>
</de.avetana.data2.entities.Aufzeichnung>
</messreihen>
<messbereiche/>
<stiffnessRecordings/>
<ecgRecordings/>
</de.iem.client2.data.IEMPatient> -
Danke! Dieses Problem ist behoben. Die Datei lässt sich dennoch nicht in das Fremdprogramm importieren. Nach langem Suchen habe ich jetzt bemerkt, dass im Original jede Zeile nur mit LF endet. Mein Code schreibt aber ans Zeilenende immer CRLF. Gibt es da Abhilfe?
Dim xdoc As XElement = XElement.Load("data.xml") Dim xws As XmlWriterSettings = New XmlWriterSettings xws.OmitXmlDeclaration = True xws.Indent = True Using stream As FileStream = File.Create("datacopy.xml") Using xw As XmlWriter = XmlWriter.Create(stream, xws) xdoc.Element("messreihen").Elements.Remove xdoc.Element("messreihen").ReplaceNodes(messreihen.Elements) xdoc.Save(xw) End Using End Using
Gruß Norbert
- Als Antwort vorgeschlagen Florian Haupt Mittwoch, 17. Oktober 2018 06:52
-
Hi,
ich habe es jetzt nicht getestet, aber es gibt viele Settings, die du nutzen kannst. Schau mal hier.
Dim xdoc As XElement = XElement.Load("data.xml") Dim xws As XmlWriterSettings = New XmlWriterSettings xws.OmitXmlDeclaration = True xws.NewLineChars = vbLf xws.Indent = True Using stream As FileStream = File.Create("datacopy.xml") Using xw As XmlWriter = XmlWriter.Create(stream, xws) xdoc.Element("messreihen").Elements.Remove xdoc.Element("messreihen").ReplaceNodes(messreihen.Elements) xdoc.Save(xw) End Using End Using
Gruß
Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP
- Bearbeitet Stefan Krömer Dienstag, 16. Oktober 2018 19:46
- Als Antwort vorgeschlagen Florian Haupt Mittwoch, 17. Oktober 2018 06:52
-
Vielen Dank! Dieser Fehler ist nun auch behoben. Trotzdem schmiert das Programm beim Import der Datei immer noch ab. Beim Vergleich einer korrekten, nicht bearbeiteten Datei mit meiner korrigierten fällt auf, dass die Länge unterschiedlich ist, obwohl beide Dateien im Editor gleich aussehen. Ich entdeckte in meiner Datei komische Zeichen. Ich weiss nicht, wie ich die in Hex ansehen könnte. In Notepad++ sehe ich den Unterschied UTF-8-BOM (bei meiner Datei) zu UTF-8 (im Original). Gibt es da auch ein "Setting" für den XmlWriter? In der Doku zum XmlWriter steht "The default value of Encoding is
Encoding.UTF8"
Warum wird bei mir BOM geschrieben?
-
Tut mir leid, dass ich so nerve. Aber ich sitze schon den vierten Tag drüber. Hab
xws.Encoding = Encoding.UTF8
verwendet. Trotzdem zeigt mir Notepad++ UTF-8-BOM. Kann es hier nach UTF-8 umwandeln lassen. Im Ergebnis erhalte ich keine korrekte Datei. Das Original ist um einige Bytes kleiner. Ich muss mein gemergtes Doc genau so haben wie das Original. Sonst falle ich auf die Nase.
Also ich mache folgendes:
Ich habe mehrere korrekte Dokumente (ca. 400). Jedes mit einer oder mehreren Messreihen. Patienten-IDs sind unterschiedlich (unbemerkte falsche Handhabung in den letzten Jahren). Alle Docs eines Patienten müssen unter einer neuen ID zusammengefasst werden. Wenn ich jetzt hingehe und lade mir z.B. zwei Dokumente in Notepad++ und ersetze die ID und füge unterhalb des Knotens "messreihen" die Messreihen beider XMLs ein und speichere die XML ab, dann lässt sie sich problemlos importieren.
Bei 400 XMLs und 1000 Messreihen würde das Wochen dauern. Deshalb habe ich mir das Hilfsprogramm geschrieben. Aber es funktioniert nicht, da sich die erzeugten XMLs nicht importieren lassen. Der Inhalt ist vom Aufbau her nicht mehr 1:1! Es kommen Zeichen hinzu, die in den Originaldateien nicht vorhanden sind.
Im Original steht z.B.
<patient class="de.iem.client2.data.IEMPatient" reference="../../.."/>
und im Studio habe ich im xdoc nach dem Load
<patient class="de.iem.client2.data.IEMPatient" reference="../../.." />
also 1 Zeichen mehr.
Hier die Merge-Routine:
Ich würde wirklich nicht so hartnäckig nerven, wenn es nicht so wichtig für uns wäre. Entschuldigung und Danke!'alle Messreihen aller XMLs in einem XElement sammeln
Dim messreihen As New XElement("messreihen") For Each xmldata As String In SL.Values Dim doc As XElement = XElement.Load(xmldata & "\Data.xml") messreihen.Add(doc.Element("messreihen").Elements) Next
'ein XML als Grund-XML öffnen Dim xdoc As XElement = XElement.Load(SL.Last.Value & "\data.xml") Dim xws As XmlWriterSettings = New XmlWriterSettings xws.OmitXmlDeclaration = True xws.NewLineChars = vbLf xws.Indent = True xws.Encoding = Encoding.UTF8
'alle Messreihen im Grund-XML entfernen und die gesammelten einfügen Using stream As FileStream = File.Create(SL.Last.Value & "\data.xml") Using xw As XmlWriter = XmlWriter.Create(stream, xws) xdoc.Element("messreihen").Elements.Remove xdoc.Element("messreihen").ReplaceNodes(messreihen.Elements) xdoc.Save(xw) End Using End Using
- Bearbeitet norbert3 Mittwoch, 17. Oktober 2018 09:28
-
Hi,
kannst du eine präparierte (ohne echte Daten) Originaldatei posten oder mir schicken ( --- )? Ich habe nachher etwas Zeit, dann kann ich mich damit beschäftigen.
Alternativ könntest du wieder XDocument nehmen und die Declaration nachher entfernen, wenn damit das Problem nicht auftritt.Ach, dann hast du ja wieder das CR/LF - Problem... Vielleicht kannst du das mit lösen, wenn du die Datei, zum Beispiel zeilenweise liest und mit "zeile = zeile.Replace(vbCrLf, vbLf)" das CR entfernst... War vielleicht ein Schnellschuss jetzt, aber eine original- Datei würde mir helfen um zu helfen.. ;)
Gruß
Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP
- Bearbeitet Stefan Krömer Mittwoch, 17. Oktober 2018 11:27 E-Mail entfernt
-
<patient class="de.iem.client2.data.IEMPatient" reference="../../.."/>
und im Studio habe ich im xdoc nach dem Load
<patient class="de.iem.client2.data.IEMPatient" reference="../../.." />
also 1 Zeichen mehr.
Hallo Norbert,
hier unsere Lösung, um das Leerzeichen, welches durch den Serializer beim lesen der XML datei entsteht, wieder zu entfernen:
Dim xmlFile As String = "C:\...\...\...\...\data.xml" Dim d = XDocument.Load(xmlFile, LoadOptions.PreserveWhitespace) Dim setting = New XmlWriterSettings With { .OmitXmlDeclaration = True, .Indent = True, .Encoding = Encoding.UTF8, .NewLineChars = vbLf } Dim xml As String Using stream As MemoryStream = New MemoryStream() Using writer = XmlWriter.Create(stream, setting) d.Save(writer) End Using stream.Position = 0 Using reader As StreamReader = New StreamReader(stream) xml = reader.ReadToEnd() End Using End Using Using sw As StreamWriter = New StreamWriter(xmlFile) sw.Write(xml.Replace(" />", "/>")) End Using
Gruß ins schöne Thüringen und weiter viel Erfolg.
Stefan
Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP
- Als Antwort markiert norbert3 Freitag, 19. Oktober 2018 08:32