Sonderzeichenproblem beim XML-Generieren mit C#

Hallo!

Ich möchte ein XML auslesen und in ein weiteres XML schreiben. Klingt eigentlich ja ganz einfach. Ist es wahrscheinlich auch.

Mein Problem dabei: Ich verwendet XMLs mit einer UTF-8 Codierung als Ausgangsbasis. Dann iteriere ich über die einzelnen Nodes des XML-Dokuments. Im Anschluss lege ich mir einen String an, mit dem ich das neue XML befüllen möchte, und zwar so:

string nodeText = node.InnerText;
XMLString = "" +
 "" +
 "";
XMLDoc = fetchData(XMLString); // wurde mit XmlDocument XMLDoc = new XmlDocument(); angelegt

Die Methode fetchData öffnet die zu lesende Datei und liest die Daten aus. Sie ist wie folgt aufgebaut:

StringBuilder sb = new StringBuilder();
byte[] buf = new byte[8192];
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream resStream = response.GetResponseStream();
string tempString = null;
int count = 0;

while (count \> 0) {
 count = resStream.Read(buf, 0, buf.Length);
 if (count != 0) {
 tempString = Encoding.UTF8.GetString(buf, 0, count);
 sb.Append(tempString);
 }
}

XmlDocument newDoc = new XmlDocument();
newDoc.LoadXml(sb.ToString()); 

Soweit funktioniert alles ganz gut. Nur sobald ich ein &, ’ oder # in der auszulesenden XML-Datei habe, bekomme ich folgende Fehlermeldung:

ERRORERROR! Description: System.Xml.XmlException: Ungültige Daten auf Stammebene. Zeile 1, Position 1.
 at System.Xml.XmlTextReader.ParseRoot()
 at System.Xml.XmlTextReader.Read()
 at System.Xml.XmlValidatingReader.ReadWithCollectTextToken()
 at System.Xml.XmlValidatingReader.Read()
 at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
 at System.Xml.XmlDocument.Load(XmlReader reader)
 at System.Xml.XmlDocument.LoadXml(String xml)
 at ASP.import\_aspx.fetchURL(String XMLString) in test.aspx:line 258 -\> hier wird XML in neues XML Dokument XmlDocument geschrieben
 at ASP.import\_aspx.ParseXml(XmlNode node) in test.aspx:line 156
 at ASP.import\_aspx.ParseXml(XmlNode node) in test.aspx:line 162
 at ASP.import\_aspx.ParseXml(XmlNode node) in test.aspx:line 162
 at ASP.import\_aspx.ImportFiles(String basedir) in test.aspx:line 79

Zur Erklärung:

test.aspx:line 258 -> hier wird XML in neues XML Dokument XmlDocument geschrieben
test.aspx:line 156 -> Aufruf von fetchData
test.aspx:line 162 -> Aufruf der Iterationsfunktion
test.aspx:line 79 -> Aufruf der Iterationsfunktion

Hat irgend jemand eine Idee, was ich zur Behebung des Problems ändern könnte?

DANKE und liebe Grüße,

melvont

Hallo Melvont,

Ich möchte ein XML auslesen und in ein weiteres XML schreiben.
Klingt eigentlich ja ganz einfach. Ist es wahrscheinlich auch.

Das ist meist der erste Fehler: Mal eben … (mach ich auch immer falsch)

Mein Problem dabei: Ich verwendet XMLs mit einer UTF-8
Codierung als Ausgangsbasis. Dann iteriere ich über die
einzelnen Nodes des XML-Dokuments. Im Anschluss lege ich mir
einen String an, mit dem ich das neue XML befüllen möchte, und
zwar so:

Wie sich das (node.InnerText) liest wird bereits ein XML Knoten geliefert. Bis dahin sollte also alles ok sein.

string nodeText = node.InnerText;
XMLString = „“ +
„“ +
„“;
XMLDoc = fetchData(XMLString); // wurde mit XmlDocument XMLDoc
= new XmlDocument(); angelegt

node gibt wohl den Knoten weiter, über den die Iteration läuft? Wo kommen die anderen Werte der Attribute her?

XmlDocument newDoc = new XmlDocument();
newDoc.LoadXml(sb.ToString());

Warum verwendest du nicht direkt:
XmlDocument newDoc = new XmlDocument();
newDoc.Load(url);

In den XML Daten dürfen Dinge wie & oder " +
„“ + „“ +
„“;

Damit entsteht soetwas:

und kann einfach ins XML rein.

Für Attribute kenne ich nicht vergleichbares.

mfg

Dirk.Pegasus

P.S.: Das Erstellen von XML Strukruten per String ist auf Dauer nicht sehr elegant und mehreren Ebenen auch nicht sehr sicher! Es ist zwar erstmal schwieriger aber

.AppendChild()
und
.Attributes.Append()

sind auf die Dauer besser!

Hallo Dirk!

Vielen Dank für Deine Antwort!!!

XmlDocument newDoc = new XmlDocument();
newDoc.LoadXml(sb.ToString());

Warum verwendest du nicht direkt:
XmlDocument newDoc = new XmlDocument();
newDoc.Load(url);

Das html kommt nicht von mir oder aus einer Datei auf einer Site; die aspx-Seite kommuniziert mit einem CMS, das Antworten im xml-Format zurückliefert. Um diese weiterverarbeiten zu können, arbeite ich den Response durch.

Der Fehler lag dann (wie so oft) eigentlich ganz woanders; das XML wurde per URL an das System übertragen - beim Auftauchen von & in der URL wurde das XML unterbrochen und war somit fehlerhaft.

Liebe Grüße,
melvont