[英]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.