C # десериализация XML получить значение элемента - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь получить значение XmlElement из перевода.

Когда я отлаживаю код, значение равно нулю.Я пытаюсь получить значение Translations.Section.Translation в Translation.cs.Я не могу понять, что я делаю неправильно и почему.Может кто-нибудь объяснить мне, что мне нужно сделать?

Я зашел так далеко, но я не знаю, как заполнить значение.

XML-документ

<?xml version="1.0" encoding="utf-8"?>
<Translations code="nl" description="Dutch" xmlns="urn:Test.Translations">

  <Section name="Module">
    <Translation key="SystemConfiguration">Systeem configuratie</Translation>
  </Section>

  <Section name="Feature">
    <Translation key="Feature">Feature</Translation>
    <Translation key="Name">Naam</Translation>
    <Translation key="IsEnabled">Actief</Translation>
  </Section>

</Translations>

Translations.cs

[Serializable()]
[XmlRoot(Namespace = "urn:Test.Translations", ElementName = "Translations", DataType = "string", IsNullable = true)]
public class Translations
{
    [XmlAttribute("code")]
    public string Code { get; set; }
    [XmlAttribute("description")]
    public string Description { get; set; }

    [XmlElement("Section")]
    public List<Section> Sections { get; set; }
}

Section.cs

public class Section
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("Translation")]
    public List<Translation> Translations { get; set; }
}

Translation.cs

public class Translation
{
    [XmlAttribute("key")]
    public string Key { get; set; }

    //TODO Get value (This is null)
    [XmlElement("Translation")]
    public string Value { get; set; }
}

program.cs

var serializer = new XmlSerializer(typeof(Translations), "");
using (var reader = new StreamReader(xmlFilePath))
{
    var translationFile = (Translations) serializer.Deserialize(reader);
    reader.Close();
}

Ответы [ 2 ]

3 голосов
/ 28 июня 2019

Используйте атрибут [XmlText]:

public class Translation
{
    [XmlAttribute("key")]
    public string Key { get; set; }

    [XmlText]
    public string Value { get; set; }
}
1 голос
/ 28 июня 2019

Попробуйте использовать XML2CSharp , чтобы сгенерировать класс, затем повторите попытку и убедитесь, что вы по-прежнему получаете нулевое значение.

Сгенерированный код для вашего XML выглядит следующим образом: (Вы можете удалить ненужные свойства)

/* 
Licensed under the Apache License, Version 2.0

http://www.apache.org/licenses/LICENSE-2.0
*/
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
[XmlRoot(ElementName="Translation", Namespace="urn:Test.Translations")]
public class Translation {
    [XmlAttribute(AttributeName="key")]
    public string Key { get; set; }
    [XmlText]
    public string Text { get; set; }
}

[XmlRoot(ElementName="Section", Namespace="urn:Test.Translations")]
public class Section {
    [XmlElement(ElementName="Translation", Namespace="urn:Test.Translations")]
    public List<Translation> Translation { get; set; }
    [XmlAttribute(AttributeName="name")]
    public string Name { get; set; }
}

[XmlRoot(ElementName="Translations", Namespace="urn:Test.Translations")]
public class Translations {
    [XmlElement(ElementName="Section", Namespace="urn:Test.Translations")]
    public List<Section> Section { get; set; }
    [XmlAttribute(AttributeName="code")]
    public string Code { get; set; }
    [XmlAttribute(AttributeName="description")]
    public string Description { get; set; }
    [XmlAttribute(AttributeName="xmlns")]
    public string Xmlns { get; set; }
}

}
...