PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET XmlDocument ersetzt Sonderzeichen nicht richtig


Elemental
2007-12-30, 23:29:33
Hallo,
ich habe gerade mit Sonderzeichen in xml experimentiert und mich gewundert, dass das XmlDocument nicht alle Sonderzeichen entsprechend "codiert".

Gemäss dieser Seite http://www.devtrain.de/news.aspx?artnr=296
gibt es folgende Sonderzeichen mit entsprechender Ersetzung:

& &
' '
< &lt;
> &gt;
" &quot;

Ä Ä
Ö Ö
Ü Ü
ä ä
ö ö
ü ü
ß ß

edit: Die blöde codebox wandelt die Umlaute immer um...


Ich habe nun bei einem meiner Programme, dass eine xml Datei auf Festplatte schreibt mittels XmlDocument.Save(string filename),
die Sonderzeichen bei einem XmlNode mittels des InnerText properties gesetzt.

In der Datei auf Festplatte sieht das so aus:

<Favorite>
<FavoriteNo>1</FavoriteNo>
<ServiceType>TV</ServiceType>
<FavoriteName>HDTVäöüÄÖÜ.ß?</FavoriteName>
</Favorite>
<Favorite>
<FavoriteNo>2</FavoriteNo>
<ServiceType>TV</ServiceType>
<FavoriteName>Nachrichten&lt;&gt;"&amp;'</FavoriteName>
</Favorite>


Ich wundere mich nun, wieso die Umlaute, sowie & und " und ' nicht ersetzt wurden.
Hat jemand eine Erklärung dafür?

mfG
Elemental

Gast
2007-12-31, 00:14:36
umlaute müssen nicht ersetzt werden, das ist ein fehler auf der von dir verlinkten seite. korrekterweise sollte der verwendete zeichensatz aber im xml-header angegeben werden.
was wirklich ersetzt werden muss sind die spitzen klammer, anführungszeichen innerhalb der tags (in deinem beispiel stehen die nur als cdata drin) und das "&", da diese die xml struktur definieren bzw das "&" eben für maskierte zeichen benötigt wird.

][immy
2007-12-31, 01:07:13
um ganz sicher zu gehen nutze
System.Web.HttpUtility.HtmlEncode(string) wenn du die Daten in die nodes einfügst und entsprechend d
System.Web.HttpUtility.HtmlDecode(string) wenn du die Daten wieder ausliest. Auf diese weise brauchst du dir um sonderzeichen und umlaute keine gedanken machen.


aber wo du schon das XMLDocument erwähnst, wie bekomme ich den Standardnamespace aus einem XMLDocument ausgelesen ohne speziel im outerxml nach xmlns zu suchen?
Das Problem ist häufig das Microsoft sich nicht entscheiden kann ob sie in ihren XML-Dateien einen Standardnamespace verwenden oder nicht. nur verwenden sie einen kann man die Nodes nicht ganz so einfach selektieren wenn man den namespace nicht kennt.

Elemental
2007-12-31, 09:45:29
Hmm, gibt es eine Methode, der ich einen xml string mit illegalen Sonderzeichen übergeben kann und die macht dann well-formed xml daraus?

Ich habe hier nämlich einen Satelliten-Receiver, der die Kanalliste als xml exportiert und der ersetzt Sonderzeichen nicht, sieht dann so aus

<Favorite>
<FavoriteNo>2</FavoriteNo>
<FavoriteName>Nachrichten<>"&'</FavoriteName>
<ServiceType>TV</ServiceType>
</Favorite>



@][immy: Gute Frage mit dem Namespace. Aber eine elegante Methode ist mir da auch nicht bekannt...

][immy
2007-12-31, 13:10:17
Hmm, gibt es eine Methode, der ich einen xml string mit illegalen Sonderzeichen übergeben kann und die macht dann well-formed xml daraus?

Ich habe hier nämlich einen Satelliten-Receiver, der die Kanalliste als xml exportiert und der ersetzt Sonderzeichen nicht, sieht dann so aus

<Favorite>
<FavoriteNo>2</FavoriteNo>
<FavoriteName>Nachrichten<>"&'</FavoriteName>
<ServiceType>TV</ServiceType>
</Favorite>



nun, das mit den Tags mitten in einer node ist natürlich ein hinderniss. würden diese in einem CDATA block stehen solltest du auch mit den sonderzeichen kein problem haben, aber so ....
dein receiver scheint weniger mit XML umzugehen als eher normale string operationen durchzuführen um an die daten ran zu kommen. sprich, er schneidet den bereich zwischen <FavoriteName> und </FavoriteName> aus und nutzt diesen. anders kann ich mir das mit den Tags mittendrin derzeit nicht vorstellen. ich würde also sagen, der verabeitet kein XML sondern nutzt lediglich eine xml-ähnliche struktur.

Elemental
2007-12-31, 17:30:38
Naja, ich denke, dass es eher ein Bug beim Export ist, denn beim Import möchte er die Daten schon xml-konform haben ;)