将对象序列化为XML时出现意外结果

4
我在创建下面的模式时遇到了问题...
<DocumentProperties>
    <Document>
        <Properties>
            <propertyName>CNumber</propertyName>
            <propertyValue>00645007803</propertyValue>
        </Properties>
        <targetFolder>\12345678\00645007803\</targetFolder>  
    </Document>
    <Document>
        <Properties>
            <propertyName>CNumber</propertyName>
            <propertyValue>00645007804</propertyValue> 
        </Properties>
        <targetFolder>\12345678\00645007804\</targetFolder>
    </Document>
</DocumentProperties>

我创建了以下类来完成这个任务。
public class DocumentProperties
{

   public DocumentProperties()
   {
       Document = new List<Document>();
   }

   public List<Document> Document { get; set; }
}

public class Document
{
     public Document()
     {
         Properties = new List<Properties>();
     }

     public List<Properties> Properties { get; set; }
     public string targetFolder { get; set; }
}

public class Properties
{
    public string propertyName { get; set; }
    public string propertyValue { get; set; }
}

public class RetrieveMultipleDocumentsRequest
{
    public SystemProperty SystemProperty { get; set; }
    public RequestProperty RequestProperty { get; set; }
      public DocumentProperties DocumentProperties { get; set; }
}

我收到的输出为“文档”和“属性”,它们成为了彼此的父子关系。我该如何解决这个问题?
我的类输出结果:
 <DocumentProperties>
    <Document>
      <Document>
        <Properties>
          <Properties>
            <propertyName>DizzzyGelespe</propertyName>
            <propertyValue>8E077A60</propertyValue>
          </Properties>
          <Properties />
        </Properties>
        <targetFolder>C:\BXml\TargetFolder\</targetFolder>
      </Document>
    </Document>
  </DocumentProperties>

生成输出的代码:
public string Serialize(RetrieveMultipleDocumentsRequest details)
{
    XmlSerializer serializer = new XmlSerializer(typeof(RetrieveMultipleDocumentsRequest));

    using(StringWriter textWriter = new StringWriter())
    {
        serializer.Serialize(textWriter, details);
        return textWriter.ToString();
    }
}

1
你的类结构看起来很好,是哪段代码生成了那个XML文件? - Rj Geraci
你的原始XML结构如何支持多个属性?在你的第二个例子中,第二个Properties应该改为Property,这样作为一个结构就有意义了! - Jamiec
@Rj 我添加了生成XML的序列化代码。 - nlstack01
@nlstack01,你能检查一下发布的代码格式和缩进吗?之前那段C#代码被格式化成了XML,并且缩进也很随意。不过这并不是什么大问题。 :) - Caramiriel
3个回答

1
显然您的命名约定使XML序列化程序有些困惑。只需明确地装饰以下元素,它应该就可以正常工作:
public class DocumentProperties
{
    public DocumentProperties()
    {
        Document = new List<Document>();
    }

    [XmlElement("Document")]
    public List<Document> Document { get; set; }
}

public class Document
{
    public Document()
    {
        Properties = new List<Properties>();
    }

    [XmlElement("Properties")]
    public List<Properties> Properties { get; set; }
    public string targetFolder { get; set; }
}

1
为了改变默认的序列化行为,您需要像下面这样注释您的对象模型。应用 XmlElement 属性将防止根据遇到的属性发出父标记,而仅发出包含数据。请保留 HTML 标签。
注:该段落已经是中文,无需翻译。
public class DocumentProperties
{

    public DocumentProperties()
    {
        Document = new List<Document>();
    }

    [XmlElement("Document")]
    public List<Document> Document { get; set; }
}

public class Document
{
    public Document()
    {
        Properties = new List<Properties>();
    }

    [XmlElement("Properties")]
    public List<Properties> Properties { get; set; }
    public string targetFolder { get; set; }
}

0

你的问题在于命名。

文档列表应该称为“documents”,而不是“document”,属性也是如此。

如果你进行这些命名更改,那么你会发现你的XML输出是正确的并且有意义。


它的格式会和初始的XML一样吗?我需要它完全保持那个格式。 - nlstack01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接