C# 将 XML 解析为带有子元素的对象

标签 c# xml xamarin

我正在尝试将 XML 文件读入 C# 对象。 XML 包含多个子元素。使用下面的代码我可以毫无问题地访问所有顶部字段(版本、实时、pageid 等),但是当我尝试访问子节点值时,我收到一个

Object reference not set to an instance of an object.

我认为这表明 XMLSerializer 无法将节点与我的对象匹配。我尝试了不同的对象类型,例如数组上的列表字段,但似乎仍然得到相同的结果,所以我不确定解决这个问题的最佳方法是什么?

任何帮助我指明正确方向的帮助将不胜感激。

XML

<?xml version="1.0" encoding="utf-8"?>
  <LiveModelStruct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <version>1</version>
   <live>true</live>
   <pageid>1</pageid>
   <data>test data</data>
   <giveawayactive>false</giveawayactive>
   <giveawayserial>00000000</giveawayserial>
   <templates>
     <template>
       <id>1</id>
       <title>Template 1</title>
       <type>Opener</type>
     </template>
     <template>
       <id>2</id>
       <title>Template 2</title>
       <type>Song</type>
     </template>
  </templates>
 </LiveModelStruct>

对象

[XmlRoot(ElementName = "LiveModelStruct")]
public class LiveModelStruct
{
    [XmlElement(ElementName = "version")]
    public string version { get; set; }
    [XmlElement(ElementName = "live")]
    public string live { get; set; }
    [XmlElement(ElementName = "pageid")]
    public string pageid { get; set; }
    [XmlElement(ElementName = "data")]
    public string data { get; set; }
    [XmlElement(ElementName = "giveawayactive")]
    public string giveawayactive { get; set; }
    [XmlElement(ElementName = "giveawayserial")]
    public string giveawayserial { get; set; }
    [XmlElement(ElementName = "templates")]
    public Templates Templates { get; set; }
    [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string Xsi { get; set; }
    [XmlAttribute(AttributeName = "xsd", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string Xsd { get; set; } 
}

[XmlRoot(ElementName = "templates")]
public class Templates
{
    [XmlElement(ElementName = "template")]
    public Template[] Template { get; set; }    
}

[XmlRoot(ElementName = "template")]
public class Template
{
    [XmlElement(ElementName = "id")]
    public string id { get; set; }
    [XmlElement(ElementName = "title")]
    public string title { get; set; }
    [XmlElement(ElementName = "type")]
    public string type { get; set; }
}

代码

...
var serializer = new XmlSerializer(typeof(LiveModelStruct));
var data = (LiveModelStruct)serializer.Deserialize(stream);
var test1 = data.version;
Debug.WriteLine(test1); //Returns 1 as it should

var test = data.Templates.Template[0].title; //Throws Error
Debug.WriteLine(test);

最佳答案

使用 LINQ to XML 来解析 XML。

Parse xml using LINQ to XML to class objects

XDocument doc = XDocument.Parse(xml);
var result = from c in doc.Descendants("LiveModelStruct")
             select new LiveModelStruct()
             {
                    version = (string)c.Element("version").Value,
                    live = (string)c.Element("live").Value
             };

关于C# 将 XML 解析为带有子元素的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975677/

相关文章:

ios - Xamarin - 如何将 View 分层在另一个 View 之上,例如键盘

c# - 如何防止 ScintillaNET 控件自动滚动?

c# - 以编程方式使新行变脏并在 DataGridView 中插入新行

c# - Visual Studio 显示不存在的错误

XML 模式 - 如何将一个属性的存在绑定(bind)到另一个属性的存在

java - 使用 java 从 XML 文件中删除节点时出现问题

android - 将 Xamarin 文本字段添加到布局时出错

c# - 如何使用 EF Code First 声明一对多关系?

.net - .NET 中的 XML 代码注释

xamarin - 如何隐藏或删除由xaml创建的特定tableSection(Xamarin.forms)?