Десериализация XML - PullRequest
       5

Десериализация XML

1 голос
/ 13 февраля 2010

Я пытался использовать инструмент xsd.exe для создания класса для следуя сгенерированному Oracle образцу xml, но всегда не получается правильно когда я пытаюсь изменить имена элементов XML оракула на имена классов, в частности, я не уверен, как это сделать для ROWSET и ROW часть это.

Я уверен, что очень плохо знаком с бизнесом сериализации / десериализации это очень легко реализовать для кого-то с немного большим знание об этом, можете ли вы мне помочь, пожалуйста.

Я создал 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 поможет мне, но он генерирует много нежелательных данных и оставляет мне возможность сортировать имена вручную. я мог бы очень нравится учиться делать это, не полагаясь на автоматизацию инструмент.

Большое спасибо,

Maya

<?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>

1 Ответ

2 голосов
/ 13 февраля 2010

Возможно, вам потребуется создать дополнительный класс Row. Также убедитесь, что классы и свойства общедоступны. Вот пример того, как сериализовать экземпляр Department в заданную XML-структуру, используя XmlSerializer :

[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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...