2012-04-18 10 views
15

支払い処理担当者に連絡しようとしています。私は私の物にXmlSerializer.Serialize を使用する場合、私はそれ以前の方法を使用してXmlSerializer.Serialize <xml>タグを取り除く

<?xml version=\"1.0\" encoding=\"utf-16\"?> 
<txn xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> 
    <ssl_merchant_id>xxxxxx</ssl_merchant_id> 
    <ssl_user_id>xxxxxx</ssl_user_id> 
    <ssl_pin>xxxxxx</ssl_pin> 
    <ssl_test_mode>True</ssl_test_mode> 
    <ssl_transaction_type>ccavsonly</ssl_transaction_type> 
    <ssl_card_number>4111111111111111</ssl_card_number> 
    <ssl_exp_date>0612</ssl_exp_date> 
    <ssl_avs_address>101 Main St.</ssl_avs_address> 
    <ssl_avs_zip>90210</ssl_avs_zip> 
</txn> 

を取得し、私は手動テストのためにXMLを構築し、これが働いた:

<txn> 
    <ssl_merchant_id>xxxxxx</ssl_merchant_id> 
    <ssl_user_id>xxxxxx</ssl_user_id> 
    <ssl_pin>xxxxxx</ssl_pin> 
    <ssl_test_mode>True</ssl_test_mode> 
    <ssl_transaction_type>ccavsonly</ssl_transaction_type> 
    <ssl_card_number>4111111111111111</ssl_card_number> 
    <ssl_exp_date>0612</ssl_exp_date> 
    <ssl_avs_address>101 Main St.</ssl_avs_address> 
    <ssl_avs_zip>90210</ssl_avs_zip> 
</txn> 

にはどうすれば<?xml version=\"1.0\" encoding=\"utf-16\"?>を剥ぎ取りに行きますかXMLからのxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">か、シリアライザで生成する必要はありませんか?私の最初の答えは、問題の半分だけだった

[XmlRoot(ElementName="txn")] 
public class AvsTransmission 
{ 
    [XmlElement] 
    public string ssl_merchant_id { get; set; } 
    [XmlElement] 
    public string ssl_user_id { get; set; } 
    [XmlElement] 
    public string ssl_pin { get; set; } 
    [XmlElement] 
    public string ssl_test_mode { get; set; } 
    [XmlElement] 
    public string ssl_transaction_type { get; set; } 
    [XmlElement] 
    public string ssl_card_number { get; set; } 
    [XmlElement] 
    public string ssl_exp_date { get; set; } 
    [XmlElement] 
    public string ssl_avs_address { get; set; } 
    [XmlElement] 
    public string ssl_avs_zip { get; set; } 
} 

答えて

28

、あなたも言及されているように宣言を削除する必要があります。

私のオブジェクトは次のようになります。ここで

は一例です:

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 

MemoryStream ms = new MemoryStream(); 
XmlWriter writer = XmlWriter.Create(ms, settings); 

XmlSerializerNamespaces names = new XmlSerializerNamespaces(); 
names.Add("", ""); 

XmlSerializer cs = new XmlSerializer(typeof(Cat)); 

cs.Serialize(writer, new Cat { Lives = 9 }, names); 

ms.Flush(); 
ms.Seek(0, SeekOrigin.Begin); 
StreamReader sr = new StreamReader(ms); 
var xml = sr.ReadToEnd(); 

文字列xmlは今含まれています

<cat><Lives>9</Lives></cat> 
+0

ありがとうございます、明日は見ていきます。 –

+0

技術的には、空の接頭辞とそのような名前空間を追加することはサポートされていません(つまり、「未定義の動作」)。 –

+0

@JeffMercadoその後、名前空間を取得する方法は? – payo

2

あなたがたXmlWriterを使用している場合は、宣言 http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.omitxmldeclaration.aspx

I'LLを省略する設定があります例を使って作業しますが、それはあなたを動かすのに十分かもしれません。


編集:ここでは

string test = "test"; 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 
MemoryStream strm = new MemoryStream(); 
XmlWriter writer = XmlWriter.Create(strm, settings); 
XmlSerializer serializer = new XmlSerializer(typeof(string)); 
serializer.Serialize(writer, test); 
strm.Position = 0; 
StreamReader reader = new StreamReader(strm); 
var x = reader.ReadToEnd(); 
x.Dump(); 
writer.Close(); 
reader.Close(); 
strm.Close(); 

出力

<string>test</string>

コメントアウトライン3と出力が

<?xml version="1.0" encoding="utf-8"?><string>test</string>

あるLinqPadで実行サンプルです
+0

ありがとう、私は明日それを見ます。 –

0

解決を単純化する。ここでUTFエンコーディング宣言 を除去する元の問題は、XML文字列にコード

5
   StringBuilder sb = new StringBuilder(); 
       var serializer = new System.Xml.Serialization.XmlSerializer(typeToSerialize.GetType()); 
       serializer.Serialize(System.Xml.XmlWriter.Create(sb, new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent=true }), typeToSerialize); 

第1関数変換の対象となるの、第二の一方はオブジェクトを変換し、同時にファイルにXMLを書き込みます。

public static string Serialize<T>(T obj) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.OmitXmlDeclaration = true; 
     var writer = new StringWriter(); 
     XmlWriter xmlWriter = XmlWriter.Create(writer, settings); 

     XmlSerializerNamespaces names = new XmlSerializerNamespaces(); 
     names.Add("", ""); 

     XmlSerializer serializer = new XmlSerializer(typeof(T)); 

     serializer.Serialize(xmlWriter, obj, names); 
     var xml = writer.ToString(); 
     return xml; 
    } 

    public static void Serialize<T>(T obj, string filepath) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.OmitXmlDeclaration = true; 
     var writer = new StreamWriter(filepath); 
     XmlWriter xmlWriter = XmlWriter.Create(writer, settings); 

     XmlSerializerNamespaces names = new XmlSerializerNamespaces(); 
     names.Add("", ""); 

     XmlSerializer serializer = new XmlSerializer(typeof(T)); 

     serializer.Serialize(xmlWriter, obj, names); 
    } 

実際に私はコードが自分自身を繰り返すことに気付きました。これらのメソッドでは、ライターオブジェクトであるものを1つだけ変更するので、コードは以下のようにする必要があります。このようにして、ライターのオブジェクトタイプを変更するだけで簡単にコードを使用することができます。

public static string Serialize<T>(T obj) 
    { 
     var writer = new StringWriter(); 
     Serialize<T>(obj,writer); 
     var xml = writer.ToString(); 
     return xml; 
    } 

    public static void Serialize<T>(T obj, string filepath) 
    { 
     var writer = new StreamWriter(filepath); 
     Serialize<T>(obj,writer); 
    } 

    public static void Serialize<T>(T obj, TextWriter writer) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.OmitXmlDeclaration = true; 
     XmlWriter xmlWriter = XmlWriter.Create(writer, settings);    
     XmlSerializerNamespaces names = new XmlSerializerNamespaces(); 
     names.Add("", "");    
     XmlSerializer serializer = new XmlSerializer(typeof(T));    
     serializer.Serialize(xmlWriter, obj, names); 
    } 
0
@のpayoさんのorignal答えと非常に似て

あなたはまた、バージョンを削除したい場合があり、名前空間を削除したい場合は、私は以下のコードので、その機能を追加した検索保存します両方を行う。

非常に大きなxmlファイルを作成しているため、出力ファイルが壊れてしまい、小さな「チャンク」でシリアライズするには大きすぎます。

public string XmlSerialize<T>(T entity) where T : class 
{ 
    // removes version 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.OmitXmlDeclaration = true; 

    XmlSerializer xsSubmit = new XmlSerializer(typeof(T)); 
    StringWriter sw = new StringWriter(); 
    using (XmlWriter writer = XmlWriter.Create(sw, settings)) 
    { 
     // removes namespace 
     var xmlns = new XmlSerializerNamespaces(); 
     xmlns.Add(string.Empty, string.Empty); 

     xsSubmit.Serialize(writer, entity, xmlns); 
     return sw.ToString(); // Your XML 
    } 
} 
関連する問題