2016-07-13 12 views
1

今はC#とXmlDocumentsで気になっています。C#Xmlエンコーディング

XMLデータを別のXMLに解析する必要がありますが、特殊文字を取得することができません。

私はXmlDocumentとXmlNodeを使用しています。 XmlDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes");
- - XmlTextWriter writer = new XmlTextWriter(outputDir + "systems.xml", Encoding.UTF8);

私は確かに知って何

- 入力XMLもUTF-8
ある - "InnerTextプロパティ" 値は交換せずに符号化されて、私がこれまで試したどのような

文字

ここにいくつかのコードがあります(多くのコードではありません...多くのコードに...)。

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(); 

しかし、私が得るには、例として、このです:

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

の代わりにこの:

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

私はXMLで他の非HTMLタグを持っているので、提供しないでくださいHTML解析ソリューション:/
文字をString.Replace()に置き換えることができますが、それは汚れていて危険です(約20K行で遅くなります)。

もっと簡単な方法があることを願っています。

敬具、
Eriwas

+3

[mcve]を入力してください。あなたのコードには、関連性のない多くのものが含まれていますが、問題がどこにあるかは不明です。可能なヒントとして、XMLコンテンツで 'InnerText'を設定すると、この問題が発生します。テキストエンコーディングとは関係ありません。 「より簡単な方法」が必要な場合は、LINQ to XMLのXmlDocumentを削除することを強くお勧めします。 –

+0

'InnerText'の代わりに' InnerXml'を試しましたか? –

答えて

0

メインはXmlDocumentの提案結果がうまく形成された文書であることを確認しながらXML文書で作業する簡単な方法を提供することです。

したがって、例のようにInnerTextを使用すると、フレームワークは文字列をエンコードし、正しくドキュメントに挿入させます。同じ値を読むたびに、デコードされ元の文字列とまったく同じように返されます。

ただし、XMLフラグメントを追加する場合は、InnerXmlまたはImportNodeを使用する必要があります。より複雑な文書構造につながる可能性があることを認識しておく必要があります。おそらくそれを避けたいと考えています。

第3の可能性として、CreateCDataSectionを使用してCDATAを追加し、そこにテキストを追加することができます。

Replaceものを試して、XMLドキュメントを文字列として扱うことは間違いありません。フレームワークに固執すればOKです。

関連する問題