2014-10-23 1 views
1

Можно ли десериализации следующий XML:Deserialize часть XML в строку

<MyObject><Test>Hi hello</Test><Something><Else><With><SubItems count='5'>hello world</SubItems></With></Else></Something></MyObject> 

в этот объект:

public class MyObject { 
    public string Test { get; set; } 
    public string Something { get; set; } 
} 

с этим, как ожидается выход (это не может в данный момент с XmlException: Unexpected node type Element. ReadElementString method can only be called on elements with simple or empty content. Line 1, position 50.)

[TestMethod] 
public void TestDeserialization() 
{ 
    var s = "<MyObject><Test>Hi hello</Test><Something><Else><With><SubItems count='5'>hello world</SubItems></With></Else></Something></MyObject>"; 

    var o = s.DeSerialize<MyObject>(); 
    Assert.AreEqual("Hi hello", o.Test); 
    Assert.AreEqual("<Else><With><SubItems count='5'>hello world</SubItems></With></Else>", o.Something); 
} 

public static class Xml 
{ 
    public static T DeSerialize<T>(this string xml) where T : new() 
    { 
     if (String.IsNullOrEmpty(xml)) 
     { 
      return new T(); 
     } 
     var xmlSer = new XmlSerializer(typeof(T)); 
     using (var stream = new StringReader(xml)) 
      return (T)xmlSer.Deserialize(stream); 
    } 
} 
+0

Да, это возможно. Вы говорите, что ваш код не работает - почему? Вы также не показываете свой код для 'DeSerialize', так как мы можем помочь? – Enigmativity

ответ

2

Один вариант может быть реализован IXmlSerializable, поэтому вы вручную читаете е внутреннее Xml в Something собственности:

public class MyObject: IXmlSerializable 
{ 
    public string Test { get; set; } 
    public string Something { get; set; } 

    public System.Xml.Schema.XmlSchema GetSchema() { return null; } 

    public void ReadXml(System.Xml.XmlReader reader) 
    {  
     if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "MyObject") 
     {   
      Test = reader["Test"]; 
      if (reader.ReadToDescendant("Something")) 
      { 
       Something = reader.ReadInnerXml(); 
      } 
     }     
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public static class Program 
{ 
    public static void Main() 
    { 
     var myObjectXmlString = "<MyObject><Test>Hi hello</Test><Something><Else><With><SubItems count='5'>hello world</SubItems></With></Else></Something></MyObject>";  
     var myObject =(MyObject) new XmlSerializer(typeof(MyObject)).Deserialize(new StringReader(myObjectXmlString)); 
     Console.WriteLine(myObject.Something); 
    } 
} 

Другим вариантом может быть преобразование Something в свойство типа XmlElement поэтому внутренний случайный кусок Xml будет сериализовать Xml вместо строки (Вы можете все еще получить его как строка, получая его OuterXml):

public class MyOtherObject 
{ 
    public string Test { get; set; }  
    public XmlElement Something { get; set; } 
    public string SomethingString 
    { 
     get { return Something.OuterXml; } 
    } 
} 

public static class Program 
{ 
    public static void Main() 
    { 
     var otherObjectXmlString = "<MyOtherObject><Test>Hi hello</Test><Something><Else><With><SubItems count='5'>hello world</SubItems></With></Else></Something></MyOtherObject>"; 
     var otherObject =(MyOtherObject) new XmlSerializer(typeof(MyOtherObject)).Deserialize(new StringReader(otherObjectXmlString)); 
     Console.WriteLine(otherObject.SomethingString);    
    } 
} 

Я создал this fiddle, так что вы можете дать им попробовать.