Загрузка данных из XML в класс с использованием XmlSerializer C # - PullRequest
0 голосов
/ 05 октября 2018

У меня есть XML, как показано ниже.

<?xml version="1.0" encoding="utf-8"?>
<RoleManagement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Permissions>
    <Group Name="Test Case Management">
      <Permission ID="1" Name="Add/Edit/Delete test cases" />
      <Permission ID="2" Name="Assign Test cases to users" />
    </Group>
    <Group Name="Bug Management">
      <Permission ID="9" Name="Add/Edit/Delete bugs" />
      <Permission ID="13" Name="View bugs" />
    </Group>
    <Group Name="Administration">
      <Permission ID="19" Name="Database backup" />
      <Permission ID="20" Name="Role Management" />
    </Group>
  </Permissions>
  <RolePermissions>
    <RolePermission RedmineId="8" PermissionID="9" />
    <RolePermission RedmineId="8" PermissionID="13" />
  </RolePermissions>
  <Roles>
    <Role Name="Manager" RedmineId="8" TestlinkId="15" />
  </Roles>
</RoleManagement>

Мне нужно загрузить данные из классов xml в C #, используя XmlSerializer.

Что я сделалFar


Я создал эти классы.

    [Serializable()]
    [System.Xml.Serialization.XmlType(AnonymousType = true)]
    [System.Xml.Serialization.XmlRoot(Namespace = "", IsNullable = false)]
    public partial class RoleManagement
    {
        private List<Group> permissionGroupsField;
        private List<RolePermission> rolePermissionsField;
        private List<Role> rolesField;
        [System.Xml.Serialization.XmlArrayItem("Group", IsNullable = false)]
        public List<Group> PermissionGroups
        {
            get { return this.permissionGroupsField; }
            set { this.permissionGroupsField = value; }
        }
        [System.Xml.Serialization.XmlArrayItem("RolePermission", IsNullable = false)]
        public List<RolePermission> RolePermissions
        {
            get { return this.rolePermissionsField; }
            set { this.rolePermissionsField = value; }
        }
        [System.Xml.Serialization.XmlArrayItem("Role", IsNullable = false)]
        public List<Role> Roles
        {
            get { return this.rolesField; }
            set { this.rolesField = value; }
        }
    }

    [Serializable()]
    [System.Xml.Serialization.XmlType(AnonymousType = true)]
    public partial class Group
    {
        private List<Permission> permissionsField;
        private string nameField;
        [System.Xml.Serialization.XmlElement("Permission")]
        public List<Permission> Permissions
        {
            get { return this.permissionsField; }
            set { this.permissionsField = value; }
        }
        [System.Xml.Serialization.XmlAttribute("Name")]
        public string GroupName
        {
            get { return this.nameField; }
            set { this.nameField = value; }
        }
    }

    [Serializable()]
    [System.Xml.Serialization.XmlType(AnonymousType = true)]
    public partial class Permission
    {
        private int idField;
        private string nameField;
        [System.Xml.Serialization.XmlAttribute()]
        public int ID
        {
            get { return this.idField; }
            set { this.idField = value; }
        }
        [System.Xml.Serialization.XmlAttribute()]
        public string Name
        {
            get { return this.nameField; }
            set { this.nameField = value; }
        }
    }

    [Serializable()]
    [System.Xml.Serialization.XmlType(AnonymousType = true)]
    public partial class RolePermission
    {
        private int redmineIdField;
        private int permissionIDField;
        [System.Xml.Serialization.XmlAttribute()]
        public int RedmineId
        {
            get { return this.redmineIdField; }
            set { this.redmineIdField = value; }
        }
        [System.Xml.Serialization.XmlAttribute()]
        public int PermissionID
        {
            get { return this.permissionIDField; }
            set { this.permissionIDField = value; }
        }
    }

    [System.Xml.Serialization.XmlType(AnonymousType = true)]
    public partial class Role
    {
        private string nameField;
        private int redmineIdField;
        private int testlinkIdField;
        [System.Xml.Serialization.XmlAttribute()]
        public string Name
        {
            get { return this.nameField; }
            set { this.nameField = value; }
        }
        [System.Xml.Serialization.XmlAttribute()]
        public int RedmineId
        {
            get { return this.redmineIdField; }
            set { this.redmineIdField = value; }
        }
        [System.Xml.Serialization.XmlAttribute()]
        public int TestlinkId
        {
            get { return this.testlinkIdField; }
            set { this.testlinkIdField = value; }
        }
    }

Моя проблема


Данные правильно загружены для<RolePermissions> узел и <Roles> узел.Но данные для узла <Permissions> вообще не загружаются.Это всегда ноль.

Что-нибудь еще, что я должен добавить, чтобы получить данные из списка в другом списке?

Есть что-то, что я пропускаю?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Используя эти классы, я смог правильно десериализовать XML:

[Serializable]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class RoleManagement
{

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("Group", IsNullable = false)]
    public List<RoleManagementGroup> Permissions { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("RolePermission", IsNullable = false)]
    public List<RoleManagementRolePermission> RolePermissions { get; set; }

    /// <remarks/>
    public RoleManagementRoles Roles { get; set; }
}

/// <remarks/>
[Serializable]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class RoleManagementGroup
{
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Permission")]
    public List<RoleManagementGroupPermission> Permission { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name { get; set; }
}

/// <remarks/>
[Serializable]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class RoleManagementGroupPermission
{

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte ID { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name { get; set; }
}

/// <remarks/>
[Serializable]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class RoleManagementRolePermission
{

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte RedmineId { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte PermissionID { get; set; }
}

/// <remarks/>
[Serializable]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class RoleManagementRoles
{

    /// <remarks/>
    public RoleManagementRolesRole Role { get; set; }
}

/// <remarks/>
[Serializable]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class RoleManagementRolesRole
{

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte RedmineId { get; set; }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte TestlinkId { get; set; }
}

Тестовый код:

string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<RoleManagement xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  <Permissions>
    <Group Name=""Test Case Management"">
      <Permission ID=""1"" Name=""Add/Edit/Delete test cases"" />
      <Permission ID=""2"" Name=""Assign Test cases to users"" />
    </Group>
    <Group Name=""Bug Management"">
      <Permission ID=""9"" Name=""Add/Edit/Delete bugs"" />
      <Permission ID=""13"" Name=""View bugs"" />
    </Group>
    <Group Name=""Administration"">
      <Permission ID=""19"" Name=""Database backup"" />
      <Permission ID=""20"" Name=""Role Management"" />
    </Group>
  </Permissions>
  <RolePermissions>
    <RolePermission RedmineId=""8"" PermissionID=""9"" />
    <RolePermission RedmineId=""8"" PermissionID=""13"" />
  </RolePermissions>
  <Roles>
    <Role Name=""Manager"" RedmineId=""8"" TestlinkId=""15"" />
  </Roles>
</RoleManagement>";

RoleManagement roleManagement;

// convert string to stream
byte[] byteArray = Encoding.UTF8.GetBytes(xml);

using (MemoryStream stream = new MemoryStream(byteArray))
{
    XmlSerializer serializer = new XmlSerializer(typeof(RoleManagement));

    using (XmlReader reader = XmlReader.Create(stream))
    {
        roleManagement = (RoleManagement)serializer.Deserialize(reader);
    }
}
0 голосов
/ 05 октября 2018

Одно из свойств названо неправильно - имя должно совпадать с именем родительского узла.У вас есть <Permissions>, поэтому свойство должно называться одинаково.Поэтому измените эту строку:

public List<Group> PermissionGroups

на эту

public List<Group> Permissions
...