2010-02-13 272 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