expertenaustausch > microsoft.* > microsoft.german.entwickler.dotnet.csharp

Marvin Massih (09.07.2008, 00:40)
Hallo,

ich schreibe per XmlDocument.Save( path ) ein XML-Dokument.
Leider ist der Parser kein "echter" XML-Parser und erwartet statt

<Knoten />

Folgendes:

<Knoten></Knoten>

Kann ich das irgendwie hinbekommen?

Gruß
Marvin
Udo Nesshoever (09.07.2008, 08:11)
> ich schreibe per XmlDocument.Save( path ) ein XML-Dokument.
> Leider ist der Parser kein "echter" XML-Parser und erwartet statt
> <Knoten />
> Folgendes:
> <Knoten></Knoten>
> Kann ich das irgendwie hinbekommen?


Versuch mal, dem Knoten ein string.Empty als InnerText zuzuweisen.

Cheers,
Udo
Christoph Schneegans (09.07.2008, 10:02)
Marvin Massih schrieb:

> ich schreibe per XmlDocument.Save( path ) ein XML-Dokument.
> Leider ist der Parser kein "echter" XML-Parser und erwartet statt
> <Knoten />
> Folgendes:
> <Knoten></Knoten>
> Kann ich das irgendwie hinbekommen?


Ja. Klarer Fall für einen eigenen XmlWriter. Schau dir mal
<http://schneegans.de/asp.net/xhtmltextwriter/> an.
Marvin Massih (10.07.2008, 10:39)
Hallo Udo,

Udo Nesshoever schrieb:
>> <Knoten></Knoten>
>> Kann ich das irgendwie hinbekommen?

> Versuch mal, dem Knoten ein string.Empty als InnerText zuzuweisen.


Danke, werde ich mal ausprobieren.

Gruß
Marvin
Marvin Massih (10.07.2008, 10:40)
Hallo Christoph,

Christoph Schneegans schrieb:
>> <Knoten></Knoten>
>> Kann ich das irgendwie hinbekommen?

> Ja. Klarer Fall für einen eigenen XmlWriter. Schau dir mal
> <http://schneegans.de/asp.net/xhtmltextwriter/> an.


Ah, danke. Sollte es mit der string.Empty-Variante nicht gehen (bzw. das
zu umständlich sein), werde ich das so umsetzen.

Gruß
Marvin
Marvin Massih (14.07.2008, 15:05)
Hallo Christoph,

Christoph Schneegans schrieb:
> Ja. Klarer Fall für einen eigenen XmlWriter. Schau dir mal
> <http://schneegans.de/asp.net/xhtmltextwriter/> an.


Habe das jetzt so implementiert.
Wie mache ich das jetzt noch mit dem Encoding? Es soll das Encoding der
XmlDeclaration verwendet werden, also muss ich ja wohl WriteTo statt
Save verwenden - aber der XmlTextWriter erwartet ja schon im Konstruktor
ein Encoding.
Was ist da der sauberste Weg?

Gruß
Marvin
Marvin Massih (14.07.2008, 16:27)
Ich schrieb:
> Wie mache ich das jetzt noch mit dem Encoding? Es soll das Encoding der
> XmlDeclaration verwendet werden, also muss ich ja wohl WriteTo statt
> Save verwenden - aber der XmlTextWriter erwartet ja schon im Konstruktor
> ein Encoding.
> Was ist da der sauberste Weg?


Der Reflector hat geholfen, hier meine Lösung:

private static Encoding GetEncoding( XmlDocument doc )
{
if (doc.HasChildNodes)
{
XmlDeclaration decl = doc.FirstChild as XmlDeclaration;
if (decl != null)
{
string encoding = decl.Encoding;
if ( !string.IsNullOrEmpty( encoding ) )
return Encoding.GetEncoding( encoding );
}
}

return null;
}

// [...]

Encoding encoding = GetEncoding( doc );
using ( MyXmlTextWriter w = new MyXmlTextWriter( xmlPath, encoding ) )
doc.Save( w );

Gruß
Marvin
Christoph Schneegans (14.07.2008, 21:34)
Marvin Massih schrieb:

> Encoding encoding = GetEncoding( doc );
> using ( MyXmlTextWriter w = new MyXmlTextWriter( xmlPath, encoding ) )
> doc.Save( w );


Das ist keine besonders gute Idee, weil du riskierst, Zeichen zu
verlieren:

Mit

Dim xml As String = "<?xml version='1.0' encoding='iso-8859-1'?><foo>α</foo>"
Dim doc As New XmlDocument
doc.LoadXml(xml)
Dim xw As New XmlTextWriter("foo.xml", Encoding.GetEncoding("iso-8859-1"))
doc.Save(xw)
xw.Close()

gibt der XmlTextWriter nicht

<?xml version="1.0" encoding="iso-8859-1"?><foo>α</foo>

aus, sondern idiotischerweise

<?xml version="1.0" encoding="iso-8859-1"?><foo>?</foo>.

Die Instanzen, die man mit XmlWriter.Create() erzeugt, machen es
besser, aber von XmlWriter zu erben macht auch wesentlich mehr
Arbeit.

Ich empfehle daher, stets UTF-8 oder UTF-16 zu verwenden, wenn man
mit XmlTextWriter arbeitet.
Marvin Massih (15.07.2008, 09:16)
Christoph Schneegans schrieb:
>> Encoding encoding = GetEncoding( doc );
>> using ( MyXmlTextWriter w = new MyXmlTextWriter( xmlPath, encoding ) )
>> doc.Save( w );

> Das ist keine besonders gute Idee, weil du riskierst, Zeichen zu
> verlieren:


Aber das Framework macht es in doc.Save(string) doch genauso...?

[..]
> <?xml version="1.0" encoding="iso-8859-1"?><foo>α</foo>
> aus, sondern idiotischerweise
> <?xml version="1.0" encoding="iso-8859-1"?><foo>?</foo>.


Na klasse.

> Ich empfehle daher, stets UTF-8 oder UTF-16 zu verwenden, wenn man
> mit XmlTextWriter arbeitet.


Der Haken ist, dass dieser Pseudo-Parser auf der Gegenseite unbedingt
ISO-8859-1 haben will. Ist aber auch nicht wirklich verwunderlich, wenn
er schon mit "<Tag />"-Tags nicht umgehen kann...

Gruß
Marvin
Christoph Schneegans (15.07.2008, 10:35)
Marvin Massih schrieb:

> Aber das Framework macht es in doc.Save(string) doch genauso...?


Das Framework hat leider einige solcher Macken; etwa

<% @Page ResponseEncoding="us-ascii" %>
<p>ä</p>

schickt

<p>?</p>

an den Browser und nicht

<p>ä</p>.

> Der Haken ist, dass dieser Pseudo-Parser auf der Gegenseite unbedingt
> ISO-8859-1 haben will.


Wenn er numerischen Zeichenreferenzen auch nicht auflösen kann,
brauchst du dir darum ja eh keinen Gedanken zu machen.

Ansonsten wäre es möglicherweise eine Option, XmlTextWriter.WriteString
(und wahrscheinlich noch ein paar andere Methoden) so zu
überschreiben, daß sie Zeichenreferenzen verwenden, wenn ein Zeichen
nicht "roh" codiert werden kann.
Marvin Massih (15.07.2008, 12:27)
Christoph Schneegans schrieb:
>> Der Haken ist, dass dieser Pseudo-Parser auf der Gegenseite unbedingt
>> ISO-8859-1 haben will.

> Wenn er numerischen Zeichenreferenzen auch nicht auflösen kann,
> brauchst du dir darum ja eh keinen Gedanken zu machen.


Kann ich mir eigentlich nicht vorstellen, wenn der Parser nicht einmal
mit <Tag /> umgehen kann...

Dann lass ich das erst mal so.

Gruß
Marvin
Ähnliche Themen