2015-01-07 2 views
1

У меня есть следующий код, чтобы отменить строку xml в C#.C# Deserializing inested xml

Все работает нормально, и я могу десериализовать его на объект. Однако значение ProjectNode всегда пустое.

Может кто-нибудь, пожалуйста, помогите мне сделать этот код работой или указать, что мне не хватает?

Образец XML был включен в код ниже.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace DeserializeSample 
{ 
    class Program 
    { 
     static string XML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><response clientos=\"Windows\" datetimepattern=\"M/d/yyyy h:mm:ss a\"><info><![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\"?><transaction loglevel=\"0\" type=\"response\"><arguments><argument name=\"id\">1</argument><argument name=\"foredit\">True</argument><argument name=\"ScheduleOn\">Estimated</argument><argument name=\"xml\"><Project xmlns=\"http://schemas.microsoft.com/project\"><UID>0</UID><ID>0</ID></Project></argument></arguments></transaction>]]></info></response>"; 

     static void Main(string[] args) 
     { 
      ProjectResponse projectResponse = CreateFromXml(XML, typeof(ProjectResponse)) as ProjectResponse; 
     } 

     public static object CreateFromXml(string data, Type msfRequestResponseType) 
     { 
      object projectResponse = null; 
      try 
      { 
       XmlSerializer deserializer = new XmlSerializer(msfRequestResponseType, ""); 
       XmlReaderSettings settings = new XmlReaderSettings() { ProhibitDtd = true }; 

       // We have content in the part so create xml reader and load the xml into XElement. 
       using (XmlReader reader = XmlReader.Create(new StringReader(data), settings)) 
       { 
        projectResponse = deserializer.Deserialize(reader); 
       } 
      } 
      catch (Exception Ex) 
      { 
       throw; 
      } 
      return projectResponse; 
     } 
    } 

    [XmlRoot("response")] 
    [Serializable] 
    public class ProjectResponse 
    { 
     [XmlAnyAttribute()] 
     public XmlAttribute[] ResponseAttributes { get; set; } 

     [XmlElement("info")] 
     public ProjectResponseInfoTag InfoTag { get; set; } 

     public class ProjectResponseInfoTag 
     { 
      private string infoText = string.Empty; 

      [XmlText] 
      public string InfoText 
      { 
       get { return infoText; } 
       set 
       { 
        infoText = value; 
        Transaction = Program.CreateFromXml(infoText, typeof(ProjectTransaction)) as ProjectTransaction; 
       } 
      } 

      [XmlElement("transaction")] 
      public ProjectTransaction Transaction { get; set; } 

      [XmlRoot("transaction")] 
      public class ProjectTransaction 
      { 
       [XmlAnyAttribute] 
       public XmlAttribute[] TransactionAttributes { get; set; } 

       [XmlElement("arguments")] 
       public ProjectArguments Arguments { get; set; } 

       public class ProjectArguments 
       { 
        [XmlElement("argument")] 
        public List<ProjectArgument> ArgList { get; set; } 

        public class ProjectArgument 
        { 
         [XmlAttribute("name")] 
         public string Name { get; set; } 

         [XmlText] 
         public string ArgValue { get; set; } 

         [XmlElement("Project")] 
         public Project ProjectNode { get; set; } 

         public class Project 
         { 
          [XmlAnyElement()] 
          public XmlElement[] ProjectElements { get; set; } 

          [XmlAnyAttribute()] 
          public XmlAttribute[] ProjectAttributes { get; set; } 
         } 
        } 
       } 
      } 
     } 
    } 

} 

ответ

0

Xml namespaces; try

[XmlElement("Project", Namespace="http://schemas.microsoft.com/project")] 
+0

Он отлично работает. Благодаря! – user2632730