web-dev-qa-db-ja.com

xmlserializerからエンコーディングを削除します

次のコードを使用してxmlドキュメントを作成しています-

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
new XmlSerializer(typeof(docket)).Serialize(Console.Out, i, ns); 

これは、名前空間属性のないxmlファイルを作成するのに最適です。ルート要素にもエンコーディング属性を含めたくないのですが、その方法が見つかりません。これができるかどうか誰かが何か考えがありますか?

ありがとう

15
czuroski

古い回答は削除され、新しいソリューションで更新されます:

Xml宣言を完全に削除しても問題ないと仮定します。これは、encoding属性がないとあまり意味がないためです。

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", "");
using (XmlWriter writer = XmlWriter.Create(Console.Out, new XmlWriterSettings { OmitXmlDeclaration = true}))
{
  new XmlSerializer(typeof (SomeType)).Serialize(writer, new SomeType(), ns);
}
25
Achim

XMLヘッダーからencodingを削除するには、nullエンコーディングのTextWriterをXmlSerializerに渡します。

MemoryStream ms = new MemoryStream();
XmlTextWriter w = new XmlTextWriter(ms, null);
s.Serialize(w, vs);

説明

XmlTextWriterは、コンストラクターで渡されたTextWriterからのエンコードを使用します。

// XmlTextWriter constructor 
public XmlTextWriter(TextWriter w) : this()
{
  this.textWriter = w;
  this.encoding = w.Encoding;
  ..

XMLを生成するときにこのエンコーディングを使用します。

// Snippet from XmlTextWriter.StartDocument
if (this.encoding != null)
{
  builder.Append(" encoding=");
  ...
6
Petr Havlicek

私のコードを手伝ってくれたこのブログの功績 http://blog.dotnetclr.com/archive/2008/01/29/removing-declaration-and-namespaces-from-xml-serialization.aspx

これが私の解決策であり、同じ考えですが、VB.NETであり、私の意見ではもう少し明確です。

Dim sw As StreamWriter = New, StreamWriter(req.GetRequestStream,System.Text.Encoding.ASCII)
Dim xSerializer As XmlSerializer = New XmlSerializer(GetType(T))
Dim nmsp As XmlSerializerNamespaces = New XmlSerializerNamespaces()
nmsp.Add("", "")

Dim xWriterSettings As XmlWriterSettings = New XmlWriterSettings()
xWriterSettings.OmitXmlDeclaration = True

Dim xmlWriter As XmlWriter = xmlWriter.Create(sw, xWriterSettings)
xSerializer.Serialize(xmlWriter, someObjectT, nmsp)
1
taylor michels
string withEncoding;       
using (System.IO.MemoryStream memory = new System.IO.MemoryStream()) {
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(memory)) {
        serializer.Serialize(writer, obj, null);
        using (System.IO.StreamReader reader = new System.IO.StreamReader(memory)) {
            memory.Position = 0;
            withEncoding= reader.ReadToEnd();
        }
    }
}

string withOutEncoding= withEncoding.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
1
kroehre