【问题标题】:XML de-serialization of child element through class in C#通过C#中的类对子元素进行XML反序列化
【发布时间】:2019-08-20 13:09:38
【问题描述】:

我正在尝试获取此 XML 文件的 BK01 字段。我不确定如何处理 XML 文件的“FLOOR”元素以及如何正确设置类以提取 BK01 值。

方法:

    public void GetBook()
{
    string path = directoryFile;

    XmlSerializer xmlSerial = new XmlSerializer(typeof(LibraryCollection));
    StreamReader sr = new StreamReader(path);
    LibraryCollection entity = xmlSerial.Deserialize(sr) as LibraryCollection;
    lblXMLName.Text = entity.BK01;  
}

[Serializable()]
[System.Xml.Serialization.XmlRoot("LIBRARY")]

public class LibraryCollection
{

    [System.Xml.Serialization.XmlElement("BK01")]

    public string BK01 { get; set; }
}

XML 文件:

<?xml version="1.0"?>
<LIBRARY>
    <FLOOR>
        <BK01 Value="Book1"/>
        <BK02 Value="Book2"/>       
    </FLOOR>
</LIBRARY>

【问题讨论】:

  • 从外观上看不考虑楼层吗?反序列化需要一个对象来表示地板。或者使用 XElement 上的 XPath 到达 //Library/Floor/BK01

标签: c# xml serialization


【解决方案1】:

你的类层次结构应该是这样定义的:

[Serializable]
[XmlRoot("LIBRARY")]
public class LibraryCollection
{
    [System.Xml.Serialization.XmlElement("FLOOR")]
    public Floor Floor { get; set; }
}

[Serializable]
public class Floor
{
    [XmlElement("BK01")]
    public BK Bk01 { get; set; }

    [XmlElement("BK02")]
    public BK Bk02 { get; set; }
}

[Serializable]
public class BK
{
    [XmlAttribute("Value")]
    public string Value { get; set; }
}

然后你可以得到这样的值:

LibraryCollection entity = xmlSerial.Deserialize(sr) as LibraryCollection;
lblXMLName.Text = entity.Floor.Bk01.Value;

【讨论】:

  • 这很好用,但我确实需要添加“.Value”:entity.Floor.Bk01.Value;
  • @Shane:当然。我将此添加到答案中。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多