簡體   English   中英

如何反序列化 XML 屬性?

[英]How do I deserialize XML attribute?

我對 C# 相當陌生,所以我希望你們能在這里指導我。 我有以下 XML,它應該轉換為帶有代碼、描述和 lang 的對象,但我真的很難獲得 XML 的 'lang' 屬性值。

目前它只返回 'code' 和 'description' 的值,而 'lang' 返回 null。

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

您無法以這種方式讀取語言屬性,因為它不是<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);

    }

為您的 XML 架構定義一個 XSD,並讓 Microsoft 的 xsd.exe 為您生成類定義。

為了獲得 XSD 的良好起點,您還可以從 XML 生成 XSD。 但是在自動生成的 XSD 上還有一些工作要做。

試試這個代碼:

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; }
}

結果是:

在此處輸入圖片說明

在這種情況下,您將 Description 定義為字符串,但在這種情況下,您必須將其定義為自己的元素類型:

[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; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM