2009-09-15 5 views
12

<?xml ?> .NETでxmlシリアル化の一部を制御するにはどうすればよいですか?私は私のオブジェクトをシリアル化するために、このメソッドを使用しています

<?xml version="1.0" encoding="utf-16"?> 
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

しかし、私は、それは次のようになりたい::

<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?> 
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

public static string XmlSerialize(object o) 
{ 
    var stringWriter = new StringWriter(); 
    var xmlSerializer = new XmlSerializer(o.GetType()); 
    xmlSerializer.Serialize(stringWriter, o); 
    string xml = stringWriter.ToString(); 
    stringWriter.Close(); 
    return xml; 
} 

をそれはこのように始まりXMLを作りますでは、エンコードをWindows-1252に変更してstandalone = yesに設定するにはどうすればよいですか? さらに、xmlns値を除外するオブジェクトを取得する方法はありますか?

this oneのようないくつかの類似した質問がありましたが、私はそれがもっと簡単かもしれないと思っていました。

更新2:Johnの回答とコメントを見て、これについてもっと考えてみたら、2番目の方法を作ることにしました。私は、1つの機会にサードパーティーのためだけにこの不気味なカスタムXMLを作成することは、最初の場所で "XmlSerialize"として一般的なものと呼ばれるべきだとは思わない。その後、

xElement.Attributes().Where(a => a.IsNamespaceDeclaration && a.Value == "http://www.w3.org/2001/XMLSchema").Remove(); 

、それはそれはジョンのコードでそれをXMLに書き込みます

ので、私は、XML文書を受け取り、まず、このようなものの名前空間の要素を削除する第二の方法を作成しました。最後に、この出力以下、そのXMLを返します。

new XDeclaration("1.0", "Windows-1252", "yes").ToString() 

そして、それは醜いだが、それは私が私のXMLを理解するには、このサードパーティのために必要な正確に何を私に取得します。

+0

実際には、 'XmlTextReader'と' XmlTextWriter'の代わりに 'XmlReader.Create'と' XmlWriter.Create'を使用してください。また、これらのものを 'using'ブロックに入れる必要があります。 –

+0

最終的に私はあなたのコードに行きました。しかし、すべてを閉じている限り、ブロックを使用するのと同じくらいうまくいくとは限りません。 – Chris

+0

いいえ 'using'ブロックは、例外が発生した場合でもオブジェクトが破棄されていることを確認します。 –

答えて

25

これを試してみてください名前空間が、その後、なぜあなたがしたいですか?


更新:あなたがStringWriterを使用するたびにエンコーディングを設定して、その上にXmlWriterを使用している場合でも、あなたは、UTF-16を取得しているようです。次のステップは、MemoryStreamに書き込むことです。しかし、それはなぜあなたが文字列を返すかという問題を提起します。たとえば、文字列を回転させてストリームに出力する場合は、このストリームに直接出力する必要があります。 TextWriterと同じです。

+0

私はAPIを使用しており、xsdがそこにあるべきではないと指定しました。なぜ彼らはそれを望んでいない、なぜ彼らはそれを無視するように見えることができない私は分かりません。 – Chris

+0

ジョン、私はxml宣言を取り除きたくありません。私はそれを保持し、出力されるものを変更したい。 – Chris

+2

OmitXmlDeclaration = trueを削除して、宣言を元に戻す必要があります。 xsd宣言を嫌うなら、あなたのAPIの人たちを蹴る必要があります。 xsi:typeを指定する必要がある場合は必要です。標準をすべて順守していないと、間もなくXMLはまったく標準にはなりません。 –

2

StringWriterの代わりにXmlTextWriterを使用できます。ここでは、私のコードの一部からあなたのエンコーディングセットを抽出したものです。これは、XSDを取り除くません

public static string XmlSerialize(object o) 
{ 
    using (var stringWriter = new StringWriter()) 
    { 
     var settings = new XmlWriterSettings 
          { 
           Encoding = Encoding.GetEncoding(1252), 
           OmitXmlDeclaration = true 
          }; 
     using (var writer = XmlWriter.Create(stringWriter, settings)) 
     { 
      var xmlSerializer = new XmlSerializer(o.GetType()); 
      xmlSerializer.Serialize(writer, o); 
     } 
     return stringWriter.ToString(); 
    } 
} 

XmlTextWriter textWriter = new XmlTextWriter(stream, Encoding.GetEncoding(1252)); 
textWriter.Namespaces = false; 
+3

.NET 2.0以降、 'XmlTextWriter'は使用されなくなりました。 –

0

FWIW、私はXMLWriterSettingsでXmlWriterを使用して動作するエンコーディングを得ました。ここではサンプルです:

... 
// My object type was from a class generated by xsd. 
XmlSerializer xms = new XmlSerializer(typeof(SomeType)); 
SomeType objSt; 
using(FileStream fs = new FileStream("C:\SomeFile.xml", FileMode.Open, FileAccess.Read)) 
{  
    using(XmlReader xr = XmlReader.Create(fs)) // Supposed to preserve encoding. 
    { 
    objSt = (SomeType)xms.Deserialize(xr); 
    }  
} 

... 
... // Do some stuff, change some attribute values. 
... 

XmlWriterSettings xsw= new XmlWriterSettings(); 
xsw.Indent= true; 
xsw.NewLineOnAttributes= true; 
xsw.Encoding = Encoding.GetEncoding(1252); 
using(XmlWriter xwXsw = XmlWriter.Create("C:\SomeFile_Changed.xml",xsw)) 
{  
    xms.Serialize(xwXsw, objSt); 
} 
... 
... // Finish up and get out. 
... 

何らかの理由で、私はそれをすべてがちょうど "XmlSerializer.DeserializeのためのMSのヘルプ(XmlReaderの)による以来、のXmlSerializerオブジェクトを使用したTextWriterをシリアライズ一度仕事を得ることができましたXmlReaderは、XMLドキュメントで指定されたエンコーディングを自動的に検出して使用します。その後、私はXmlWriterSettingsで遊び始め、何かを壊しました....

+0

あなたのFileStream、 'XmlReader'と' XmlWriter'を 'using'ブロックに入れないために-1になりました。 –

+0

クール - コメントに「例外処理なし」または「」を明示的に記載しています。なぜ私がそのようにしたのか、長い時間前には分かりません。あなたの気持ちを傷つけるつもりはありませんでした:) – GTAE86

+0

あなたはどんなコメントをしていますか? –

関連する問題