2012-04-18 79 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\"?>xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">從XML或不具有序列化程序生成它開始?

我的目標是這樣的:

[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

謝謝,我明天再看。 – 2012-04-18 21:29:33

+0

從技術上講,不支持添加一個空的前綴和名稱空間(即「未定義的行爲」)。 – 2012-04-18 22:17:16

+0

@JeffMercado然後如何獲得NO命名空間? – payo 2012-04-18 22:28:30

2

如果您使用的XmlWriter有省略聲明 http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.omitxmldeclaration.aspx

我會設置在一個例子上工作,但這可能足以讓你去。


編輯:下面是在LinqPad運行

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>

樣品
+0

謝謝,我明天再看。 – 2012-04-18 21:29:28

0

只是爲了簡化soln。除去UTF編碼聲明 這裏的原問題是代碼

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

第一功能轉換對象到XML字符串,第二個轉換對象和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); 
    } 

其實我意識到代碼重複你自己。在這些方法中,只需更改一個作者對象,因此代碼必須如下所示。以這種方式,只需通過更改編寫器對象類型即可輕鬆使用代碼。

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的一部開拓創新的答案:

如果你想刪除您可能還需要刪除版本的命名空間,爲您節省搜索我添加了功能,所以下面的代碼會做兩個。

我還用普通的方法將它包裹起來,因爲我創建了非常大的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 
    } 
}