2015-10-07 5 views
4

Я возникли проблемы, создающие ниже схему ...Неожиданные результаты при сериализации объектов в XML

<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? –

+0

Как структура XML, такая как ваша оригинальная, поддерживает несколько свойств? В вашем втором примере второй «Свойства» должен, вероятно, быть «Свойством», а затем он имеет смысл в качестве структуры! – Jamiec

+0

@Rj Я добавил код Serialize, который генерирует xml – nlstack01

ответ

1

Вам нужно будет аннотировать модель объекта, как показано ниже, для того, чтобы изменить поведение сериализации по умолчанию. Это приложение атрибута XmlElement предотвратит выделение родительского тега на основе найденного свойства и вместо этого выдает только содержащиеся данные.

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

Ваша проблема здесь с именованием.

Список документов должен называться «документы», а не «документ», то же относится к свойствам.

Если вы сделаете эти изменения имен, вы увидите, что ваш вывод XML правильный и имеет смысл.

+0

будет ли он в том же формате, что и intial xml? Мне нужно это точно в том формате – nlstack01

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; } 
}