2011-03-26 49 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