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