none
XmlDeclaration beim Schreiben unterdrücken RRS feed

  • 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

    Dienstag, 16. Oktober 2018 14:18

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
    Freitag, 19. Oktober 2018 08:15

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

    Dienstag, 16. Oktober 2018 14:34
    Moderator
  • 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

    Dienstag, 16. Oktober 2018 14:34
  • 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

    Dienstag, 16. Oktober 2018 14:36
    Moderator
  • 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>

    Dienstag, 16. Oktober 2018 14:52
  • Hi,

    wenn ich mich recht erinnere, geht das mit XDocument.Save nicht.

    Aber mit dem XmlWriter, schau mal hier.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Dienstag, 16. Oktober 2018 15:41
  • 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
    Dienstag, 16. Oktober 2018 18:24
  • 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


    Dienstag, 16. Oktober 2018 19:41
  • 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?

    Mittwoch, 17. Oktober 2018 07:36
  • 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:

    '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

    Ich würde wirklich nicht so hartnäckig nerven, wenn es nicht so wichtig für uns wäre. Entschuldigung und Danke!


    • Bearbeitet norbert3 Mittwoch, 17. Oktober 2018 09:28
    Mittwoch, 17. Oktober 2018 09:27
  • 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
    Mittwoch, 17. Oktober 2018 09:57

  •       <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
    Freitag, 19. Oktober 2018 08:15
  • Das ist die perfekte Lösung! Jetzt funktioniert der Import der neu geschriebenen XML einwandfrei. Vielen Dank!

    Gruß Norbert

    Freitag, 19. Oktober 2018 08:33