Как десериализовать атрибут XML? - PullRequest
0 голосов
/ 28 марта 2020

Я довольно новичок в C#, так что я надеюсь, что вы, ребята, поможете мне здесь. У меня есть следующее XML, которое должно быть преобразовано в объект с кодом, описанием и языком, но я действительно изо всех сил пытаюсь получить значение атрибута 'lang' XML.

В настоящее время это только возвращают значения для «кода» и «описания», в то время как «lang» возвращает ноль.

<?xml version="1.0" encoding="UTF-8"?>
<statisticgroup>
  <code>2049</code>
  <description lang="en-GB">2049</description>
</statisticgroup>
  [Serializable]
  public class XmlStatisticsModel
  {
    [XmlElement ( "code" )]
    public string Code { get; set; }

    [XmlElement ( "description" )]
    public string Description { get; set; }

    [XmlAttribute ( "lang" )]
    public string Lang { get; set; }
  }

Ответы [ 4 ]

1 голос
/ 28 марта 2020

Вы не можете прочитать атрибут языка таким образом, потому что это не атрибут узла <statisticgroup> (который представляет ваш класс), а атрибут узла <Description>. Измените Description на класс и укажите его атрибут следующим образом:

        [Serializable]
        public class Description
        {
            [XmlText]
            public string Value { get; set; }

            [XmlAttribute("lang")]
            public string Lang { get; set; }
        }

        [Serializable]
        [XmlRoot("statisticgroup")]
        public class XmlStatisticsModel
        {
            [XmlElement("code")]
            public string Code { get; set; }

            [XmlElement("description")]
            public Description Description { get; set; }
        }

    static void Main(string[] args)
    {
        string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<statisticgroup>
  <code>2049</code>
  <description lang=""en-GB"">2049</description>
</statisticgroup>
";
        StringReader sr = new StringReader(xml);
        XmlStatisticsModel statisticsModel = (XmlStatisticsModel)new XmlSerializer(typeof(XmlStatisticsModel)).Deserialize(sr);
        Console.WriteLine("Description: {0} (lang: {1})", statisticsModel.Description.Value, statisticsModel.Description.Lang);

    }
0 голосов
/ 28 марта 2020

В этом случае вы определяете описание как строку, но в этом случае вы должны определить его как собственный тип элемента:

[XmlRoot(ElementName="description")]
public class Description 
{
    [XmlAttribute ( "lang" )]
    public string Lang { get; set; }
    [XmlText]
    public string Text { get; set; }
}

Затем внутри основного объекта вы определите его как:

    [XmlElement(ElementName="description")]
    public Description Description { get; set; }
0 голосов
/ 28 марта 2020

попробуйте этот код:

class Program
{
    static void Main(string[] args)
    {
        string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
        <statisticgroup>
            <code>2049</code>
            <description lang=""en-GB"">2049</description>
        </statisticgroup>
        ";
        var sr = new StringReader(xml);
        var deserialized = new XmlSerializer(typeof(Statisticgroup)).Deserialize(sr);
    }
}

[XmlRoot(ElementName = "description")]
public class Description
{
    [XmlAttribute(AttributeName = "lang")]
    public string Lang { get; set; }
    [XmlText]
    public string Text { get; set; }
}

[XmlRoot(ElementName = "statisticgroup")]
public class Statisticgroup
{
    [XmlElement(ElementName = "code")]
    public string Code { get; set; }
    [XmlElement(ElementName = "description")]
    public Description Description { get; set; }
}

Результат:

enter image description here

0 голосов
/ 28 марта 2020

определите XSD для вашей XML схемы и позвольте Microsoftsofts xsd.exe сгенерировать определение класса для вас.

Чтобы получить хорошую отправную точку для вашего XSD, вы также можете сгенерировать XSD из вашего XML. Но над автоматически сгенерированным XSD есть работа.

...