Laden...

XmlException --> 0x1C

Erstellt von Levitas vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.381 Views
L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren
XmlException --> 0x1C

Verwendetes Datenbanksystem: XML

Hallo Leute! Ich bin derzeit dabei eine, leider teilweise invalide XML einzulesen, und sie in eine valide Form umzuschreiben. Nun habe ich Probleme mit dieser XML, da sie CDATA-Abschnitte enthält, in der nicht einfache strings, sondern kombinationen von bytes abgespeichert werden.

Z.B. ein Abschnitt aus dieser XML, der den XmlReader in die Knie zwingt:


<m_Width>896</m_Width>
<m_Height>896</m_Height>
<m_Areas></m_Areas>
<WorldLightProfiles><North></North>
<South></South>
</WorldLightProfiles>
<BuildCounter>CDATA[      	   Ù  õ        õ  ]</BuildCounter>
<m_NetIsHost>0</m_NetIsHost>
<m_NetPlayers>0</m_NetPlayers>
<m_NetHostAdr></m_NetHostAdr>

Schaut man sich sich den Inhalt von CDATA im Hex-Editor an, steht da zwischen den []:
"1C 00 00 00 17 00 00 00 09 00 00 00 D9 07 00 00 F5 07 00 00 01 00 00 00 01 00 00 00 F5 07 00 00"

Nun habe ich mir eine eigene Methode zum Auslesen der wichtigen Teile geschrieben, z.B. brauche ich nur m_Width, m_Height, m_Areas und dann erst wieder alles ab m_NetIsHost. Es kommt später dann auch sehr oft vor, das ich größere Teile überspringen muss, deswegen mache ich das mit ReadToFollowing("");


        public static void WriteValue(string SourceName, string DestName, string AttributeName, XmlReader reader, XmlWriter writer)
        {
            writer.WriteStartElement(DestName);
            {
                reader.ReadToFollowing(SourceName);
                writer.WriteAttributeString(AttributeName, reader.ReadString());
            }
            writer.WriteEndElement();
        }

Dabei wird das ganze mit einem XmlWriter in die neue Xml geschrieben, ich denke mal der Code ist selbstverstänlich...

Mal angenommen, der Reader ist im moment bei <m_Areas>, und ich rufe ReadToFollowing("m_NetIsHost"); auf, so bekomme ich folgende XmlException:

"' ', hexidezimaler Wert 0x1C, ist ein ungültiges Zeichen. Zeile 9, Position 21."

Und Zeile 9, Position 21 in der Xml ist eben dieses 0x1C das ich oben an erster Stelle schrieb...

Nun, meine Frage: Was kann ich tun, um das zu vermeiden? 😦

Mfg Marc

6.862 Beiträge seit 2003
vor 14 Jahren

Hallo,

die .Net XML Klassen gehen davon aus das das XML valide ist, so wie im Prinzip jede XML verarbeitende Technologie davon ausgeht. Problem sind dabei nicht die Zeichen im CData Abschnitt, sondern das der CData Abschnitt falsch deklariert ist.
Die müssen so

<![CDATA[...Inhalt...]]> 

gekennzeichnet werden. Sind sie es nicht, so wie bei dir, kannst du mit den XML Klassen nicht arbeiten.

Baka wa shinanakya naoranai.

Mein XING Profil.

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

hmmm 😦

Ziemlich blöd... Kann man denn nicht irgendwie umstellen, das er nicht prüfen soll?

Mfg Marc

6.862 Beiträge seit 2003
vor 14 Jahren

Nicht das ich wüsste, nicht valides XML ist kein XML 😃

Was du versuchen könntest wäre den entsprechenden CData Abschnitt durch einfache Stringersetzung in die gültige Form zu bringen bevor du das XML verarbeitest.

Baka wa shinanakya naoranai.

Mein XING Profil.

L
Levitas Themenstarter:in
95 Beiträge seit 2009
vor 14 Jahren

Das habe ich mir auch schon gedacht, aber das problem ist, das ich diese CDATA abschnitte in der XML verarbeiten muss...

Ich denke, ich versuche mal das ganze mit einem StreamReader Zeile für Zeile... Diese CDATA-Abschnitte müssen teilweise (das ist ja das Problem) mit gewissen Algorithmen übersetzt werden... Whatever, ich probier das einfach mal 😉

Danke für den Tipp 😃

Mfg Marc