繁体   English   中英

将C#类序列化为xml

[英]Serialize c# class to xml

我正在尝试解析到xml类,但是没有得到想要的结果。 让我解释:

这些是以下类:

 public class ParCard { public string ExtrFreq { get; set; } public string LastDay { get; set; } public string FolderPath { get; set; } public List<EFile> Files { get; set; } //public List<string> Files { get; set; } public string FTPAddress { get; set; } public string FTPPath { get; set; } public string FTPUser { get; set; } public string FTPPass { get; set; } } public class EFile { public string FileName { get; set; } } 

这是实际结果:

<?xml version="1.0" encoding="utf-8"?>
<ParCard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ExtrFreq>Daily</ExtrFreq>
<LastDay>20140101</LastDay>
<FolderPath>c:\Temp\</FolderPath>
<Files>
  <EFile>
    <FileName>file1.txt</FileName>
  </EFile>
  <EFile>
    <FileName>file2.txt</FileName>
  </EFile>
  <EFile>
    <FileName>file3.txt</FileName>
  </EFile>
</Files>
<FTPAddress>10.1.1.100</FTPAddress>
<FTPPath>Home</FTPPath>
<FTPUser>User</FTPUser>
<FTPPass>Pass</FTPPass>
</ParCard>

这就是我想要实现的目标:

<?xml version="1.0" encoding="utf-8"?>
<ParCard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ExtrFreq>Daily</ExtrFreq>
<LastDay>20140101</LastDay>
<FolderPath>c:\Temp\</FolderPath>
<Files>
  <FileName>file1.txt</FileName>
  <FileName>file2.txt</FileName>
  <FileName>file3.txt</FileName>
</Files>
<FTPAddress>10.1.1.100</FTPAddress>
<FTPPath>Home</FTPPath>
<FTPUser>User</FTPUser>
<FTPPass>Pass</FTPPass>

对于序列化,我使用:

 static public void Serialize(ParCard pc) { XmlSerializer serializer = new XmlSerializer(typeof(ParCard)); using (TextWriter writer = new StreamWriter(@"Teste.xml")) { serializer.Serialize(writer, pc); } } 

我究竟做错了什么?!?!? 你能指出我吗?

提前致谢

我不确定是否有更好的方法,但这可行:

public class ParCard
{
    public string ExtrFreq { get; set; }
    public string LastDay { get; set; }
    public string FolderPath { get; set; }
    public EFile Files { get; set; }
    public string FTPAddress { get; set; }
    public string FTPPath { get; set; }
    public string FTPUser { get; set; }
    public string FTPPass { get; set; }
}

public class EFile
{
    [XmlElement("FileName")]
    public List<string> FileName { get; set; }
}

如果想要所需的输出,则需要将“ List更改为字符串列表:

public List<EFile> Files { get; set; }

变成

public List<string> Files { get; set; }

您将获得额外的XML节点,因为File属性在另一个类中。

如果您不愿意放弃初始结构,并遵循@ Pheonixblade9的回答,那么您始终可以使用hack来获取它,同时仍然使用EFile类。 返回bool的ShouldSerialize {}方法将告诉序列化程序如何处理相应的属性,在这种情况下,我们还想做其他一些事情,例如将Files的内容复制到FilesAsString中的新List中。 然后使用XmlIgnore完全忽略原始的Files属性,然后使用XmlArray和XmlArrayItem重新定义集合以及元素的名称。

class Program
{
    static void Main(string[] args)
    {

        ParCard pc = new ParCard();
        pc.ExtrFreq = "Daily";
        pc.LastDay = "20140101";
        pc.FolderPath = @"c:\temp";
        pc.Files = new List<EFile>() { new EFile() { FileName = "file1.txt" }, new EFile { FileName = "file2.txt" } };
        pc.FTPAddress = "10.1.1.100";
        pc.FTPPath = "Home";
        pc.FTPUser = "User";
        pc.FTPPass = "Pass";

        Serialize(pc);
    }

    static public void Serialize(ParCard pc)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(ParCard));
        using (TextWriter writer = new StreamWriter(@"Teste.xml"))
        {
            serializer.Serialize(writer, pc);
        }
    }
}

public class ParCard
{
    public string ExtrFreq { get; set; }
    public string LastDay { get; set; }
    public string FolderPath { get; set; } 

    [XmlIgnore]
    public List<EFile> Files { get; set; }

    [XmlArray("Files"), XmlArrayItem(typeof(string), ElementName = "FileName")]
    public List<string> FilesAsString { get; set; }
    public string FTPAddress { get; set; }
    public string FTPPath { get; set; }
    public string FTPUser { get; set; }
    public string FTPPass { get; set; }

    public bool ShouldSerializeFilesAsString()
    {
        List<string> fileNames = new List<string>();
        foreach (var eFile in Files)
        {
            fileNames.Add(eFile.FileName);
        }

        FilesAsString = fileNames;
        return true;
    }
}


public class EFile
{
    public string FileName { get; set; }
}

这将产生您想要的输出:

<?xml version="1.0" encoding="utf-8"?>
<ParCard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ExtrFreq>Daily</ExtrFreq>
    <LastDay>20140101</LastDay>
    <FolderPath>c:\temp</FolderPath>
    <Files>
        <FileName>file1.txt</FileName>
        <FileName>file2.txt</FileName>
    </Files>
    <FTPAddress>10.1.1.100</FTPAddress>
    <FTPPath>Home</FTPPath>
    <FTPUser>User</FTPUser>
    <FTPPass>Pass</FTPPass>
</ParCard>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM