2016-12-21 4 views
1

В настоящее время я пытаюсь изменить мои классы, чтобы мое текстовое свойство на моей модели содержало весь внутренний текст узла (text).C# XML десериализация. Чтение всего внутреннего текста из узла в свойство строки

Пример XML, который дает мне проблемы, является:

  <component> 
       <section> 
        <title>Reason for Visit</title> 
        <text> 
         <content ID="ID3EZZKACA">No Reason for Visit was given.</content> 
        </text> 
       </section> 
      </component> 

Моя цель для text собственности моей модели, чтобы иметь следующую строку:

"<content ID="ID0EAAKACA">No Reason for Visit was given.</content>"

В настоящее время моя модель выглядит например:

public partial class ComponentSection { 
    //other model properties here 
    private string textField; 

    [System.Xml.Serialization.XmlTextAttribute()] 
    public string text { 
     get { 
      return this.textField; 
     } 
     set { 
      this.textField = value; 
     } 
    } 
    //getters/setters for other properties here 
} 

Итак, я в настоящее время пытаюсь это сделать, используя аннотацию [System.Xml.Serialization.XmlTextAttribute()], но когда я это делаю, свойство text всегда проходит через нуль, когда xml десериализуется.

Вся помощь приветствуется.

+0

Мне обычно проще * сериализовать * XML так, как я хочу; с этим сделано десериализация прямолинейна. –

+1

Мне может быть проще с Linq2Xml 'var elem = XDocument.Load (filename) .XPathSelectElement (" // text ");' –

+0

@Dan, к сожалению, это не правдоподобный подход в моем сценарии. Мне даны огромные XML-документы из разных источников. попытка сериализации в этот xml займет довольно большое количество дополнительного времени. У меня есть автоматически созданные классы из .xsd – GregH

ответ

2

Как я уже сказал в комментарии, начиная с сериализации часто бывает проще. Для приведенного выше XML, вот некоторые классы

public sealed class component 
{ 
    public section section { get; set; } 
} 
public sealed class section 
{ 
    public string title { get; set; } 
    public text text { get; set; } 
} 
public sealed class text 
{ 
    public content content { get; set; } 
} 
public sealed class content 
{ 
    public string text { get; set; } 
    public string ID { get; set; } 
} 

Затем модифицировать содержание класс control XML serialization:

public sealed class content 
{ 
    [XmlText] 
    public string text { get; set; } 
    [XmlAttribute] 
    public string ID { get; set; } 
} 

Вы можете сериализовать экземпляр со следующим кодом:

 static string ToXmlString<T>(T t) 
     { 
      var serializer = new XmlSerializer(t.GetType()); 
      using (var sw = new System.IO.StringWriter()) 
      { 
       serializer.Serialize(sw, t); 
       return sw.ToString(); 
      } 
     } 
     static void Main(string[] args) 
     { 
      var c = new component { section = new section { 
          title = "Reason for Visit", text = new text { content = new content { 
          ID = "ID3EZZKACA", text = "No Reason for Visit was given." } } } }; 

      string s = ToXmlString(c); 
      Console.WriteLine(s); 
     } 

В результате получается следующее XML:

<?xml version="1.0" encoding="utf-16"?> 
<component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http 
://www.w3.org/2001/XMLSchema"> 
    <section> 
    <title>Reason for Visit</title> 
    <text> 
     <content ID="ID3EZZKACA">No Reason for Visit was given.</content> 
    </text> 
    </section> 
</component> 
+0

Что случилось с проголосованием? –