碰到一个问题,请问尽量不改动xml文件也尽量不要使用xml的手工解析形成类实体,来改动下我的类!
1 针对学生及其选修课一个语境
2 XML文件(body部分):
   
   <StudentsObjects>
      <Students>
         <StudentObject>
            <ID></ID>
            <Name></Name>
            <!-- 主要是下面这一部分来改动,但是KC和KC节点之间就不要插入节点了-->
            <KCs>
               <KC>shuxue</KC>
               <KC>yuwen</KC>
               ...
            </KCs>
         </StudentObject>
         <StudentObject>
            ...
         </StudentObject>
           .......
      </Students>
   </StudentsObjects>
   
3 目前我建立了3个实体类,
   public class StudentObjects
   {
      public List<StudentObject> Students = new .....;
   }
   public class StudentObject
   {
     public string ID;
     public string Name;
     public List<KC> KCs; //假如这样写的话xml饭序列化后得到的Student实体的KCs是得不到值,也就是说这个类并不匹配xml   }
   public class KC
   {
     public string MyKC;
   }   序列化和反序列化相关方法类似如下:
     XmlSerializer ser = new XmlSerializer(obj.GetType());
    ser.Serialize(new FileStream(@"users.xml", FileMode.Create), obj);    反序列化:    XmlSerializer serializer = new XmlSerializer(Type.GetType("MyObject"));
    MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));

解决方案 »

  1.   

    这个问题其实很好解决的。
    首先,将XML文本串读到一个string对象xmltext
    接着,执行两次替换:xmltext = xmltext.Replace("<KC>", "<KC><MyKC>"); xmltext = xmltext.Replace("</KC>", "</MyKC></KC>");
    然后,再利用LZ构造的反序列化程序即可
      

  2.   

    namespace ConsoleApp
    {
    class Program
    {
    static void Main(string[] args)
    {
    Student stu = new Student();
    stu.ID = "2501";
    stu.Name = "劉輝";

    stu.KCs = new List<string>() { "物理", "數學", "語文", "英語" }; System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(stu.GetType());
    StringBuilder sbOutPut = new StringBuilder();
    System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(sbOutPut);
    serializer.Serialize(xw, stu);
    Student rStu = serializer.Deserialize(new System.IO.StringReader(sbOutPut.ToString())) as Student;
    }
    } public class Student
    {
    public string ID { get; set; }
    public string Name { get; set; }
    [XmlArrayItem("KC")]  //注意这一句
    public List<string> KCs { get; set; }
    }
    }
      

  3.   

    还有就是没有建 KC 类了,直接用 List<string>。
      

  4.   

    你这样把替换都写死了,不太好
    能否给出完整的更改了,个人感觉你的更改比较接近我的想法,不过我使用了这个,没用原来写的KC类,可是xml反序列化后KCs仍然值为空,不知道你测试了没有?
      [XmlArrayItem("KC")]  //注意这一句
            public List<string> KCs 
      

  5.   

    我试过了,用XmlArrayItem属性可以解决LZ的问题。学习
      

  6.   

    呵呵,我上面的程序就是完整的啊,你在变量 rStu 定义的下一行加一个断点,就可以看到反序列化后 rStu.KCs 里面已经包括了那四个 KC 的值了。
    序列化后 sbOutPut 的值输出到屏幕上以后结果跟你的样例中的是一样的。
      

  7.   

    哦,呵呵,是我的xml文件没有及时更新导致得不到正确结果,请去http://topic.csdn.net/u/20090319/22/ba41cbbc-350d-412a-8288-839313446124.html?seed=526555024留言,一并分给你。