2011-03-26 74 views
0

棘手的問題我有一個關於淺序列化對象有關列表<T>到XML

的名單我的實體

public class Requests 
{ 
    public string Action { get; set; } 
    public Meta MetaType { get; set; } 

} 

public class Meta 
{ 
    public string MerchantId { get; set; } 
    public string IpAddress { get; set; } 
    public string Version { get; set; } 
} 

淺序列化,XMLSerializer的

List<Requests> lstXML = new List<Requests>(); 

    Requests xml = new Requests(); 
    xml.Action = "INSERT"; 
    xml.MetaType = new Meta { IpAddress = "192.2.3.4", MerchantId = "DALE", Version = "1" }; 
    lstXML.Add(xml); 
    xml = new Requests(); 
    xml.Action = "UPDATE"; 
    xml.MetaType = new Meta { IpAddress = "192.2.3.40", MerchantId = "SECD", Version = "1" }; 
    lstXML.Add(xml); 


    using (var sw = new StreamWriter(@"C:\XML\test.txt")) 
    { 
     var serializer = new XmlSerializer(typeof(List<Requests>)); 
     serializer.Serialize(sw, lstXML); 

    } 

輸出文本文件文本一個棘手的問題。 txt

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfRequests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Requests> 
    <Action>INSERT</Action> 
    <MetaType> 
    <MerchantId>DALE</MerchantId> 
    <IpAddress>192.2.3.4</IpAddress> 
    <Version>1</Version> 
</MetaType> 
    </Requests> 
<Requests> 
<Action>UPDATE</Action> 
<MetaType> 
    <MerchantId>SECD</MerchantId> 
    <IpAddress>192.2.3.40</IpAddress> 
    <Version>1</Version> 
</MetaType> 
    </Requests> 
    </ArrayOfRequests> 

我現在的問題是

1)我需要刪除<?XML 版本= 「1.0」 ....>和 < ArrayOfRequests ...> 標籤,只保留 的XML我的實體標記。我如何 這樣做?

2)如何在輸出文本文件中CAPITALIZE(CAPS) 元素名稱( - > )?

我期望的文本文件輸出將提前傢伙

<XML> 
<REQUESTS> 
<ACTION>INSERT</ACTION> 
<META> 
    <MERCHANTID>DALE</MERCHANTID> 
    <IPADDRESS>202.164.178.163</IPADDRESS> 
    <VERSION>1</VERSION> 
</META> 
<REQUESTS> 

<REQUESTS> 
<ACTION>INSERT</ACTION> 
<META> 
    <MERCHANTID>DALE</MERCHANTID> 
    <IPADDRESS>202.164.178.163</IPADDRESS> 
    <VERSION>1</VERSION> 
</META> 
<REQUESTS> 

</XML> 

謝謝! =)

+0

如果您將兩個單獨的問題作爲單獨的問題提出,您會獲得更多成功! – 2011-03-26 15:16:03

+1

''標記是強制​​性的,沒有它你的XML文檔是無效的...... – 2011-03-26 15:21:51

+0

而且無論如何,你只能有1個根元素,所以用你想要的文件格式不能包含多於1個請求對象 – 2011-03-26 15:23:39

回答

3

嘗試

[XmlType("REQUESTS")] 
public class Requests 
{ 
    [XmlElement(ElementName="ACTION")] 
    public string Action { get; set; } 

    [XmlElement(ElementName="META")] 
    public Meta MetaType { get; set; } 
    ... 

} 

public class Meta 
{ 

    [XmlElement(ElementName="MERCHANTID")] 
    public string MerchantId { get; set; } 
    ... 
} 

var serializer = new XmlSerializer(typeof(List<Requests>), new XmlRootAttribute("XML")); 
+0

[XmlElement的(的ElementName =「REQUEST」)]是不正確的 – CSharpNoob 2011-03-26 15:38:21

+0

@CSharpNoob謝謝!編輯! – 2011-03-26 15:46:59

+0

謝謝!工作正常,除了根元素,不出現在文本文件... – CSharpNoob 2011-03-26 15:55:43

1

所以,你不需要XML序列化。你想要一個自定義的近似值。因此,你可能需要自己寫。你使用任何模板語言?如果你知道你要預先序列化的類型,模板系統將會非常有用。如果您事先不知道類型,請下一個答案。

1

絕對簡單的解決辦法可能是處理字符串,按照目前的產生,與一對夫婦的後處理步驟:

// Stream to a string instead of directly to the file 
yourString = // stream XML here. 

// Remove the xmlns stuff. 
yourString = yourString.Replace(
      " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", 
      ""); 

// Upper-case the start-elements and end-elements (your data has no attributes, 
// so keep it simple) 
yourString = Regex.Replace(yourString, 
          "<\{0,1}([^>]+)>", 
          delegate(Match m) 
          { 
           return m.Value.ToUpper(); 
          }); 
+0

感謝您回答第二個問題,我也認爲它是自XmlSerializer自動創建xmlns標題以來唯一的解決方案... – CSharpNoob 2011-03-26 15:57:08