2012-03-23 106 views
0

我还有一个关于让我的XML序列化整齐的问题,我似乎无法得到正确的答案。我的配置文件如下:从多个类生成XML?

namespace SMCProcessMonitor 
{ 
[Serializable()] 
[XmlRoot("Email-Settings")] 
    public class Config 
{  
     [XmlElement("Recipient")] 
     public string recipient; 
     [XmlElement("Server-port")] 
     public int serverport; 
     [XmlElement("Username")] 
     public string username; 
     [XmlElement("Password")] 
     public string password; 
     [XmlElement("Program")] 
     public List<Programs> mPrograms = new List<Programs>(); 
     public string serialId; 
    } 

    public class Email 
    { 

      public string Recipient 
      { 
       get 
       { 
        return SMCProcessMonitor.ConfigManager.mConfigurations.recipient; 
       } 
       set 
       { 
        SMCProcessMonitor.ConfigManager.mConfigurations.recipient = value; 
       } 
      } 

      public int ServerPort 
      { 
       get 
       { 
        return SMCProcessMonitor.ConfigManager.mConfigurations.serverport; 
       } 
       set 
       { 
        SMCProcessMonitor.ConfigManager.mConfigurations.serverport = value; 
       } 
      } 
      public string Username 
      { 
       get 
       { 
        return SMCProcessMonitor.ConfigManager.mConfigurations.username; 
       } 
       set 
       { 
        SMCProcessMonitor.ConfigManager.mConfigurations.username = value; 
       } 
      } 
     public string Password { get; set; } 

    } 
     [Serializable()] 
    public class Programs 
{ 
     [XmlElement("Filename")] public string mFileName { get; set; } 
     [XmlElement("Filepath")]public string mFilePath { get; set; } 
} 

     public class Database 
     { 
      public string mSerial { get; set; } 
     } 
     } 

理想我想做的事就是有这三个类(电子邮件设置,数据库和程序)都有自己的标签,像这样

<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<email-settings> 
    <Recipient>sadh</Recipient> 
    <Server-port>23</Server-port> 
    <Username>lkms</Username> 
    <Password>kmkdvm</Password> 
</email-settings> 
<Program> 
    <Filename>MerlinAlarm.exe</Filename> 
    <Filepath>D:\Merlin\Initsys\Merlin\Bin\MerlinAlarm.exe</Filepath> 
</Program> 
<database-settings> 
    <serialId>1</serialId> 
</database-settings> 
</Config> 

但相反,我得到的东西,类似于此:

<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<Recipient>blah</Recipient> 
<Server-port>1111</Server-port> 
<Username>blah</Username> 
<Password>blah</Password> 
<Program> 
<Filename>chrome.exe</Filename> 
<Filepath> 
C:\Users\Shane\AppData\Local\Google\Chrome\Application\chrome.exe 
</Filepath> 
</Program> 
<serialId>1234</serialId> 
</Config> 

对不起,是这样的麻烦,但现在这是在做我的螺母和IM肯定有我的思念here..can一些基本的逻辑有人给我了一些p-关于如何以上面指定的格式获取这个XML? 谢谢,Shane。

编辑:我的序列化类。

namespace SMCProcessMonitor 
{ 
public class ShanesXMLserializer 
{ 
    private string mFileAndPath; 
    public Config mConfigurations = null; 
    public Config mConfigurationsProgram = null; 



    public ShanesXMLserializer(string inFileAndPath) 
    { 
     mFileAndPath = inFileAndPath; 
     mConfigurations = new Config(); 

    } 

    public bool Write() 
    { 
     try 
     { 
      XmlSerializer x = new XmlSerializer(mConfigurations.GetType()); 
      StreamWriter writer = new StreamWriter(mFileAndPath); 
      x.Serialize(writer, mConfigurations); 
      writer.Close(); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Exception found while writing: " + ex.Message); 
     }; 

     return false; 
    } 

    public bool Read() 
    { 
     try 
     { 
      XmlSerializer x = new XmlSerializer(typeof(Config)); 
      StreamReader reader = new StreamReader(mFileAndPath); 
      mConfigurations = (Config)x.Deserialize(reader); 
      reader.Close(); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Exception found while reading: " + ex.Message); 
     }; 

     return false; 
    } 

    public Config GetConfigEmail 
    { 
     get 
     { 
      return mConfigurations; 
     } 
    } 


} 

}

编辑2: 我的新的配置文件: @Craig - 我使用这个配置文件,它是像你说的,但即时通讯仍然没有得到想要的XML,后显示我的配置类。

  using System; 
      using System.Collections.Generic; 
      using System.Linq; 
      using System.Xml.Serialization; 
      using System.Text; 

命名空间SMCProcessMonitor { [序列化()]

 public class Config 
{  

     public string recipient; 
     public int serverport; 
     public string username; 
     public string password; 
     public List<Programs> mPrograms = new List<Programs>(); 
     public string serialId; 
    [XmlElement("email-settings")] 
     public Email Email { get; set; } 
     public Programs Programs { get; set; } 
    [XmlElement("database-settings")] 
     public Database Database { get; set; } 


    } 

    public class Email 
    { 
     [XmlElement("Recipient")] 
     public string Recipient { get; set; } 
      [XmlElement("Server-port")] 
     public int ServerPort { get; set; } 
     [XmlElement("Username")] 
     public string Username { get; set; } 
     [XmlElement("Password")] 
     public string Password { get; set; } 

    } 
     [Serializable()] 
    public class Programs 
    { 
     [XmlElement("Filename")] public string mFileName { get; set; } 
     [XmlElement("Filepath")]public string mFilePath { get; set; } 
    } 

    public class Database 
    { 
     [XmlElement("SerialID")] 
     public string mSerial { get; set; } 
    } 
    } 

但我仍然得到:

<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <recipient>shane</recipient> 
    <serverport>23</serverport> 
    <username>oid</username> 
    <password>jidj</password> 
    <mPrograms/> 
    </Config> 
+0

你能写出你用于序列化的代码段吗? – daryal 2012-03-23 12:20:57

+0

这是我的序列化代码。请注意,由于将变量移动到其各自的类,因此在写入时告诉我“对象引用未设置为对象的实例”时,现在遇到错误。 – 2012-03-23 13:56:45

+0

@Shane'Shamus'Coulter使用你添加到你的问题中的序列化代码,将使用我提供的'class'修改来输出你想要的XML。为了测试它,你可以逐字从我的答案中复制这些类,填充一个'Config'对象并通过你发布的序列化代码运行它。你需要改变的唯一事情就是你的财产获得者和制定者在适用的情况下。 – Craig 2012-03-23 14:14:02

回答

1

这会给你所需的输出:

public class Config 
{ 
    [XmlElement("email-settings")] 
    public Email Email { get; set; } 

    public Program Program { get; set; } 

    [XmlElement("database-settings")] 
    public Database Database { get; set; } 
} 

public class Email 
{ 
    public string Recipient { get; set; } 

    [XmlElement("Server-port")] 
    public int ServerPort { get; set; } 

    public string Username { get; set; } 
    public string Password { get; set; } 
} 

public class Program 
{ 
    public string Filename { get; set; } 

    public string Filepath { get; set; } 
} 

public class Database 
{ 
    public string serialId { get; set; } 
} 

这是一个控制台应用程序,它将序列化一个对象到一个文件并产生你正在寻找的确切的XML。只需将其复制并粘贴到控制台应用程序中,然后从中取出即可。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var config = new Config 
      { 
       Email = new Email 
       { 
        Recipient = "sadh", 
        ServerPort = 23, 
        Username = "lkms", 
        Password = "kmkdvm" 
       }, 
       Program = new Programs 
       { 
        Filename = "MerlinAlarm.exe", 
        Filepath = @"D:\Merlin\Initsys\Merlin\Bin\MerlinAlarm.exe" 
       }, 
       Database = new Database 
       { 
        serialId = "1" 
       } 
      }; 

      XmlSerializer serializer = new XmlSerializer(typeof(Config)); 

      var textWriter = new StreamWriter(@"C:\config.xml"); 
      serializer.Serialize(textWriter, config); 
      textWriter.Close(); 

      Console.Read(); 
     } 
    } 

    #region [Classes] 

    public class Config 
    { 
     [XmlElement("email-settings")] 
     public Email Email { get; set; } 

     public Programs Program { get; set; } 

     [XmlElement("database-settings")] 
     public Database Database { get; set; } 
    } 

    public class Email 
    { 
     public string Recipient { get; set; } 

     [XmlElement("Server-port")] 
     public int ServerPort { get; set; } 

     public string Username { get; set; } 
     public string Password { get; set; } 
    } 

    public class Programs 
    { 
     public string Filename { get; set; } 

     public string Filepath { get; set; } 
    } 

    public class Database 
    { 
     public string serialId { get; set; } 
    } 

    #endregion 
} 
+0

我应该将声明添加到其各自的类,或将它们留在配置? – 2012-03-23 13:50:02

+0

@ Shane'Shamus'Coulter把它们留在你的'Config'类中。这将为您提供您在问题中提到的格式的XML。在你的问题中,你在'Config''类中有'List ',但是这在你提供的所需的XML输出中没有描述。 – Craig 2012-03-23 14:03:23

+0

请参阅编辑2. – 2012-03-23 14:12:54

0

我打算在这里提出一个完全横向的方法,只是为了简单和维护的缘故。

如果您使用源XML文件并生成了XSD架构,该怎么办?

例如:

xsd.exe MyXMLFile1.xml 

这将生成一个XML架构文件(MyXMLFile1.xsd)。就拿模式,并生成类(再次使用xsd.exe):

xsd.exe /c MyXMLFile1.xsd 

这将生成一个序列化的保证POCO,您可以使用前进。类名称和属性可能与您当前的POCO中的名称和属性不匹配,但它会生成预期的XML以及从XML中反序列化。

增加的好处是,未来只需修改源XML文件,然后运行这两个命令来维护POCO。

希望可以帮助...