您如何在对象中表示此XML?

时间:2009-02-23 17:07:24

标签: .net xml xml-serialization

<FileTransferSettings>
  <UploadPath src="user">C:\uploads</UploadPath>
  <DownloadPath src="app">C:\downloads</DownloadPath>
</FileTransferSettings>

我想将此XML反序列化为具有2个属性的FileTransferSettings对象 - UploadPath和DownloadPath。但是我也希望以我的代码可以查询它的方式保留每个属性的src属性。

我认为创建一个关联的UploadPathSrc和DownloadPathSrc属性有点笨拙和麻烦。

还有另一种方法可以在.NET中表示这一点吗?对我来说,src属性似乎应该被视为元数据。这是最好的做法吗?

(背景为为什么我正在尝试这样做 - 请参阅我的previous question)。

感谢。

3 个答案:

答案 0 :(得分:4)

为了正确地序列化和反序列化XML,您需要使用XML序列化属性来修饰类

[XmlRoot("FileTransferSettings")]
public class FileTransferSettings
{
   [XmlElement("DownloadPath")]
   public DownloadPath DownloadPath { get; set; }
   // ...
}

[XmlType("DownloadPath")]
public class DownloadPath
{ 
  [XmlAttribute]
  public string Src; // or use enum etc
  [XmlText]
  public string Text;
}

// the serialized XML looks like
<FileTransferSettings>
   <DownloadPath Src="...">text</DownloadPath>
   ....
</FileTransferSettings>

答案 1 :(得分:3)

您可以创建第二个类FileTransferPath,其字符串值为“Path”,枚举值为“Source”

class FileTransferSettings
{
   public FileTransferPath UploadPath { get; set; }
   public FileTransferPath DownloadPath { get; set; }
   // ...
}

class FileTransferPath
{
   public string Path { get; set; }
   public FileTransferSource Source { get; set}

   public enum FileTransferSource
   {
     None,
     User,
     Application,
     // ...
   }
}

然后你可以使用像

这样的代码
   obj.UploadPath.Path;
   obj.UploadPath.Source;

您可以为类属性选择更好的名称;我不知道我喜欢Path的重复。 obj.Upload.Path或其他东西可能会更好。

请注意,您无法直接对使用XmlSerialization的格式直接序列化/反序列化;但它确实完成了你所需要的。 (你仍然可以序列化为XML,你只需要做更多的工作)

答案 2 :(得分:3)

扩展Daniel L.的总体思路。

public Class FileTransferPath
{
  public Enum SourceEnum { User, App }

  public SourceEnum Source { get; set; }  //Automatic properties in 3.5 Syntax
  public string FilePath { get; set; }
}

public Class FileTransferSettings
{
  public FileTransferPath UploadPath { get; set; }
  public FileTransferPath DownLoadPath { get; set; }
}