2010-02-13 222 views
1

我试图使用xsd.exe工具为Oracle生成的xml示例生成 的类,但始终未能正确地得到它 当我尝试将oracle xml元素名称更改为类的名称时, 具体我不知道如何做到这一点,它为 的ROWSET和ROW部分。XML反序列化

对于序列化/反序列化业务来说,这是非常新颖的,我相信 这对于那些对它有点更多知识的人来说非常容易实现,有些可以帮助我。

我已经创建了2类为部门和员工:

[XmlRoot("ROWSET")] 
class Department 
{ 
    [XmlElement("DEPARTMENT_ID")] 
    string DepID { set; get; } 
    [XmlElement("DEPARTMENT_NAME")] 
    string DepName { set; get; } 
    [XmlElement("EMPLOYEES")] 
    Employee[] Employees { set; get; } 
} 
class Employee 
{ 
    [XmlElement("EMP_ID")] 
    string DepID { set; get; } 
    [XmlElement("EMP_NAME")] 
    string DepName { set; get; } 
} 

但是,这无法工作,在运行时,它会抱怨不能找到该行 元素,说实话我不知道如何在代码中告诉 忽略它并从下一个节点开始。我知道xsd.exe会帮助我,但它会产生大量不需要的数据,并会让我手动对这些名称进行排序。我会 真的很想学习如何做到这一点,而不依赖于自动化工具 。

非常感谢,

玛雅

<?xml version="1.0"?> 
<ROWSET> 
    <ROW> 
    <DEPARTMENT_ID>1</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>Sales</DEPARTMENT_NAME> 
    <EMPLOYEES> 
     <EMP> 
     <EMP_ID>12</EMP_ID> 
     <EMP_NAME>Fred</EMP_NAME> 
     </EMP> 
     <EMP> 
     <EMP_ID>13</EMP_ID> 
     <EMP_NAME>Hohn</EMP_NAME> 
     </EMP> 
    </EMPLOYEES> 
    </ROW> 
    <ROW> 
    <DEPARTMENT_ID>2</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>Marketing</DEPARTMENT_NAME> 
    <EMPLOYEES></EMPLOYEES> 
    </ROW> 
</ROWSET> 
+0

你需要声明一个类,它可以存储一系列部门。检出XmlArrayAttribute。 – 2010-02-13 14:29:52

回答

2

您可能需要创建一个额外的类。还要确保课程和属性是公开的。下面是使用的如何将Department实例序列化到给定的XML结构的例子:

[XmlRoot("ROWSET")] 
public class Department 
{ 
    [XmlElement("ROW")] 
    public Row[] Rows { get; set; } 
} 

public class Row 
{ 
    [XmlElement("DEPARTMENT_ID")] 
    public string DepID { set; get; } 

    [XmlElement("DEPARTMENT_NAME")] 
    public string DepName { set; get; } 

    [XmlArray("EMPLOYEES")] 
    [XmlArrayItem("EMP")] 
    public Employee[] Employees { set; get; } 
} 

public class Employee 
{ 
    [XmlElement("EMP_ID")] 
    public string EmpID { set; get; } 

    [XmlElement("EMP_NAME")] 
    public string EmpName { set; get; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var dep = new Department 
     { 
      Rows = new[] 
      { 
       new Row 
       { 
        DepID = "1", 
        DepName = "Sales", 
        Employees = new[] 
        { 
         new Employee 
         { 
          EmpID = "12", 
          EmpName = "Fred" 
         }, 
         new Employee 
         { 
          EmpID = "13", 
          EmpName = "Hohn" 
         } 
        } 
       }, 
       new Row 
       { 
        DepID = "2", 
        DepName = "Marketing", 
       } 
      } 
     }; 
     var serializer = new XmlSerializer(dep.GetType()); 
     serializer.Serialize(Console.Out, dep); 
    } 

和反序列化回Department实例:

var xml = 
@"<?xml version=""1.0""?> 
<ROWSET> 
    <ROW> 
    <DEPARTMENT_ID>1</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>Sales</DEPARTMENT_NAME> 
    <EMPLOYEES> 
     <EMP> 
     <EMP_ID>12</EMP_ID> 
     <EMP_NAME>Fred</EMP_NAME> 
     </EMP> 
     <EMP> 
     <EMP_ID>13</EMP_ID> 
     <EMP_NAME>Hohn</EMP_NAME> 
     </EMP> 
    </EMPLOYEES> 
    </ROW> 
    <ROW> 
    <DEPARTMENT_ID>2</DEPARTMENT_ID> 
    <DEPARTMENT_NAME>Marketing</DEPARTMENT_NAME> 
    <EMPLOYEES></EMPLOYEES> 
    </ROW> 
</ROWSET>"; 

using (var reader = new StringReader(xml)) 
{ 
    var department = (Department)serializer.Deserialize(reader); 
} 
+0

非常感谢Darin! – Maya 2010-02-13 16:05:23