C# 关于列表的棘手问题<;T>;到XML

C# 关于列表的棘手问题<;T>;到XML,c#,xml,serialization,C#,Xml,Serialization,关于对象列表的浅序列化,我有一个棘手的问题 我的实体 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 s

关于对象列表的浅序列化,我有一个棘手的问题

我的实体

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

    }
List lstXML=newlist();
请求xml=新请求();
xml.Action=“插入”;
xml.MetaType=newmeta{IpAddress=“192.2.3.4”,MerchantId=“DALE”,Version=“1”};
添加(xml);
xml=新请求();
xml.Action=“更新”;
xml.MetaType=newmeta{IpAddress=“192.2.3.40”,MerchantId=“SECD”,Version=“1”};
添加(xml);
使用(var sw=newstreamwriter(@“C:\XML\test.txt”))
{
var serializer=newxmlserializer(typeof(List));
serializer.Serialize(sw,lstXML);
}
输出文本文件text.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>

插入
山谷
192.2.3.4
1.
更新
SECD
192.2.3.40
1.
现在我的问题是

1) 我需要删除<?XML version=“1.0”…>和 仅标记并保留 我的实体的XML标记。我怎么能 这样做

2) 我如何将大写字母大写 元素名称(-> )在输出文本文件中

我想要的文本文件输出是

<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>

插入
山谷
202.164.178.163
1.
插入
山谷
202.164.178.163
1.

提前谢谢大家!=)

所以,您不需要XML序列化。您需要它的自定义近似值。因此,你可能不得不自己写。您是否使用任何类型的模板语言?如果您事先知道要序列化的类型,模板系统将极大地帮助您。如果您事先不知道类型,请回答下一个问题。

因此,您不希望XML序列化。您需要它的自定义近似值。因此,你可能不得不自己写。您是否使用任何类型的模板语言?如果您事先知道要序列化的类型,模板系统将极大地帮助您。如果您事先不知道类型,请回答下一个问题。

试试

[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),new-XmlRootAttribute(“XML”);
试试看

var serializer=new-XmlSerializer(typeof(List),new-XmlRootAttribute(“XML”);

最简单的解决方案可能是处理当前生成的字符串,并执行两个后处理步骤:

// 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(); 
                           });
//流到字符串,而不是直接到文件
yourString=//此处为XML流。
//删除xmlns内容。
yourString=yourString.Replace(
“xmlns:xsi=\”http://www.w3.org/2001/XMLSchema-instance\"", 
""); 
//大写:开始元素和结束元素(数据没有属性,
//因此,保持简单)
yourString=Regex.Replace(yourString,
"]+)>", 
代表(匹配m)
{
返回m.Value.ToUpper();
});

最简单的解决方案可能是处理当前生成的字符串,并执行两个后处理步骤:

// 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(); 
                           });
//流到字符串,而不是直接到文件
yourString=//此处为XML流。
//删除xmlns内容。
yourString=yourString.Replace(
“xmlns:xsi=\”http://www.w3.org/2001/XMLSchema-instance\"", 
""); 
//大写:开始元素和结束元素(数据没有属性,
//因此,保持简单)
yourString=Regex.Replace(yourString,
"]+)>", 
代表(匹配m)
{
返回m.Value.ToUpper();
});

如果您将这两个独立的问题作为独立的问题提问,您将获得更大的成功!
标记是必需的,没有它,您的XML文档将无效……而且,您只能有一个根元素,因此,按照您希望的格式,文档不能包含多个请求对象。我的错误实际上是根元素,是的,将有多个请求tag@Thomas我的输出文件不是XML,而是,一个文本文件如果你把这两个独立的问题作为独立的问题提出来,你会更成功!
标记是必需的,没有它,您的XML文档将无效……而且,您只能有一个根元素,因此,按照您希望的格式,文档不能包含多个请求对象。我的错误实际上是根元素,是的,将有多个请求tag@Thomas我的输出文件不是XML,而是,a短信文件谢谢!除了根元素外,工作正常,不会出现在文本文件中……是否将“XML”作为XmlSerializer的第二个参数?yup var serializer=new XmlSerializer(typeof(List),“XML”);“XML”在“xmlns:xsd=”“xmlns=“XML”>元素中。@CSharpNoob查看此帖子谢谢!除了根元素外,工作正常,不会出现在文本文件中……您是否将“XML”作为XmlSerializer的第二个参数?yup var serializer=new XmlSerializer(typeof(List),“XML”);“XML”在“xmlns:xsd=”“xmlns=“XML”中>元素。@CSharpNoob查看此帖子感谢您回答第二个问题,我还认为这是唯一的解决方案,因为XmlSerializer自动创建xmlns标题…感谢您回答第二个问题,我还认为这是唯一的解决方案,因为XmlSerializer自动创建xmlns标题。。。