1

我正在将给定的 XML 文件反序列化为一个对象,我工作得很好。但是,我现在要调整 XML 文件,以便我有额外的属性,这些属性应该被反序列化为一个单独的对象,所以从一个给定的 xml 文件中我可以填充两个对象,这可能在一个操作中实现吗?

这是我当前的代码和 XML:

XML 现在的样子:

<NameCollection>
   <Names>
      <Name>
        <description></description>
      <Name>
      <Name>
        <description></description>
      <Name>
   </Names>
</NameCollection>

XML 如我所愿:

<NameCollection>
  <GenericName></GenericName>
  <GenericDescription></GenericDescription>
   <Names>
      <Name>
        <description></description>
      <Name>
      <Name>
        <description></description>
      <Name>
   </Names>
</NameCollection>

代码:

NameCollection commands;

XMLSerializer serializer = new XMLSerializer(typeof(NameCollection));
StreamReader streamReader = new StreamReader(xmlpath);

commands = (NameCollection)serializer.Derserialize(streamreader);

streamReader.Close();

和当前对象:

[Serializable()]
public class TestCommand
{
   public string description{get;set;}
}

[Serializable()]
[XmlRoot("NameCollection")]
public class NameCollection
{
   [XmlArray("Commands")]
   [XmlArrayItem("Command", typeof(TestCommand))]
   public TestCommand[] TestCommand {get;set;}
}

然后我希望将 GenericName 和 GenericDescription 属性添加到另一个单独的对象,这就是我坚持的。

4

2 回答 2

3

我认为你的目标是让你的类反映 XML 的结构,而不是两个类。所以你想要一个像这样的结构:

public class TestCommand
{
   public string description{get;set;}
}

[XmlRoot("NameCollection")]
public class NameCollection
{
    public string GenericName {get; set;}
    public string GenericDescription {get; set;}

   [XmlArray("Commands")]
   [XmlArrayItem("Command", typeof(TestCommand))]
   public TestCommand[] TestCommand {get;set;}
}

然后以完全相同的方式对其进行序列化,完成工作。

于 2012-10-02T13:22:49.527 回答
2

使用您拥有的布局,唯一XmlSerializer想要放置这些额外值的地方是 on NameCollection,即

[XmlRoot("NameCollection")]
public class NameCollection
{
    public string GenericName {get;set:}
    public string GenericDescription {get;set:}

    [XmlArray("Names")]
    [XmlArrayItem("Name", typeof(TestCommand))]
    public TestCommand[] TestCommand {get;set;}
}

如果您希望它继续作用于其他对象,则:XmlSerializer不会那样做。

于 2012-10-02T13:23:04.253 回答