2016-07-13 16 views
1

Ich flippe gerade mit C# und XmlDocuments aus.C# Xml Encoding

Ich muss XML-Daten in ein anderes XML analysieren, aber ich kann keine Sonderzeichen zum Arbeiten bekommen.

Ich arbeite mit XmlDocument und XmlNode.

Was habe ich versucht, so weit:
- XmlDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes");
- XmlTextWriter writer = new XmlTextWriter(outputDir + "systems.xml", Encoding.UTF8);

Was ich weiß sicher:
- Die XML-Eingabe ist auch UTF-8
- Der "Innertext" Wert ohne Austausch der codiert wird, Zeichen

Hier ist ein Code (nicht alle ... Art und Weise zu viel Code):

XmlDocument newXml = new XmlDocument(); 
newXml = (XmlDocument)systemsTemplate.Clone(); 
newXml.CreateXmlDeclaration("1.0", "UTF-8", "yes"); 
newXml.SelectSingleNode("systems").RemoveAll(); 
foreach(XmlNode categories in  exSystems.SelectNodes("root/Content/Systems/SystemLine")) 
     { 
      XmlNode categorieSystemNode = systemsTemplate.SelectSingleNode("systems/system").Clone(); 
      categorieSystemNode.RemoveAll(); 
      XmlNode importIdNode = systemsTemplate.SelectSingleNode("systems/system/import_id").Clone(); 
      string import_id = categories.Attributes["nodeName"].Value; 
      importIdNode.InnerText = import_id; 
      categorieSystemNode.AppendChild(importIdNode); 
      [way more Nodes which I proceed like this] 
     } 
newXml.SelectSingleNode("systems").AppendChild(newXml.ImportNode(categorieSystemNode, true)); 
XmlTextWriter writer = new XmlTextWriter(outputDir + "systems.xml", Encoding.UTF8); 
     writer.Formatting = Formatting.Indented; 
     newXml.Save(writer); 
     writer.Flush(); 
     writer.Close(); 

Aber ich bekommen, was ist dies als Beispiel:

<intro>&lt;p&gt;Whether your project [...]</intro> 

Statt dessen:

<intro><p>Whether your project [...] </p></intro> 

Ich habe tun andere Nicht-HTML-Tags in der XML so bitte nicht bieten HTML-Parsing-Lösungen:/
Ich weiß, ich könnte die Zeichen durch String.Replace() ersetzen, aber das ist schmutzig und unsicher (und langsam mit etwa 20K Zeilen).

Ich hoffe, es gibt eine einfachere Möglichkeit, dies zu tun.

Mit freundlichen Grüßen,
Eriwas

+3

Bitte geben Sie eine [mcve] an. Ihr Code enthält viele Dinge, die nicht relevant sind, und es ist nicht klar, wo das Problem liegt. Als möglichen Hinweis erhalten Sie dieses Problem, wenn Sie 'InnerText' mit XML-Inhalt festlegen, es hat nichts mit der Textcodierung zu tun. Wenn Sie einen "einfacheren Weg" wünschen, würde ich Ihnen dringend empfehlen, 'XmlDocument' für LINQ to XML zu entfernen. –

+0

Haben Sie 'InnerXml' anstelle von' InnerText' ausprobiert? –

Antwort

0

Der Haupt von XmlDocument vorschlagen, ist eine einfache Möglichkeit zu schaffen, mit XML-Dokumenten zu arbeiten, gleichzeitig aber dafür sorgen das Ergebnis ist ein gut gebildet Dokument.

So verwenden Sie InnerText wie in Ihrem Beispiel, lassen Sie das Framework die Zeichenfolge codieren und ordnungsgemäß in das Dokument einfügen. Immer wenn Sie denselben Wert lesen, wird er entschlüsselt und genau wie Ihre ursprüngliche Zeichenfolge an Sie zurückgegeben.

Wenn Sie jedoch trotzdem ein XML-Fragment hinzufügen möchten, sollten Sie mit InnerXml oder ImportNode bleiben. Sie müssen sich bewusst sein, dass dies zu einer komplexeren Dokumentenstruktur führen könnte, und Sie möchten dies wahrscheinlich vermeiden.

Als dritte Möglichkeit können Sie die CreateCDataSection verwenden, um eine CDATA hinzufügen und Ihren Text dort hinzufügen.

Sie sollten auf jeden Fall davon weg sein, dieses XML-Dokument als Zeichenfolge zu behandeln, indem Sie versuchen Replace Dinge; halte dich an den Rahmen und du wirst in Ordnung sein.