簡體   English   中英

將XML值反序列化為對象

[英]Deserialize XML values to objects

我正在嘗試使用XDocument讀取XML並將其反序列化為對象。

我想采用以下XML:

<r25:spaces xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:r25="http://www.collegenet.com/r25" pubdate="2019-07-15T14:51:16-07:00" engine="accl">
  <r25:space crc="00000022" status="est" xl:href="space.xml?space_id=200">
    <r25:space_id>200</r25:space_id>
    <r25:space_name>LRN 0001</r25:space_name>
    <r25:formal_name>Learning Commons -Test Scheduling Room</r25:formal_name>
    <r25:partition_id xl:href="rmpart.xml?partition_id=2">2</r25:partition_id>
    <r25:last_mod_dt>2019-07-11T08:01:00-07:00</r25:last_mod_dt>
  </r25:space>
</r25:spaces>

並將其反序列化為空格列表(其中Space具有以下定義):

public class Space
{
    public long space_id { get; set; }
    public string space_name { get; set; }
    public string formal_name { get; set; }
    public long partition_id { get ; set; }
    public DateTime last_mod_dt { get; set; }
}

我只得到了XElement。 它死在串行器上

var doc = XDocument.Parse(result.Content);
XNamespace ns = "http://www.collegenet.com/r25";
XElement el = doc.Element(ns + "spaces");

foreach (var space in el.Elements())
{
    var serializer = new XmlSerializer(typeof(Space));
    var s = (Space)serializer.Deserialize(space.CreateReader());
}

您可以在這里簡單地使用LINQ to XML 例如

using System;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApp22
{

    public class Space
    {
        public long space_id { get; set; }
        public string space_name { get; set; }
        public string formal_name { get; set; }
        public long partition_id { get; set; }
        public DateTime last_mod { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var xml = @"
<r25:spaces xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xl=""http://www.w3.org/1999/xlink"" xmlns:r25=""http://www.collegenet.com/r25"" pubdate=""2019-07-15T14:51:16-07:00"" engine=""accl"">
  <r25:space crc=""00000022"" status=""est"" xl:href=""space.xml?space_id=200"">
    <r25:space_id>200</r25:space_id>
    <r25:space_name>LRN 0001</r25:space_name>
    <r25:formal_name>Learning Commons -Test Scheduling Room</r25:formal_name>
    <r25:partition_id xl:href=""rmpart.xml?partition_id=2"">2</r25:partition_id>
    <r25:last_mod_dt>2019-07-11T08:01:00-07:00</r25:last_mod_dt>
  </r25:space>
</r25:spaces>
";
            var doc = XDocument.Parse(xml);
            XNamespace ns = "http://www.collegenet.com/r25";

            var q = from e in doc.Element(ns + "spaces").Elements()
                    select new Space
                    {
                        space_id = (int)e.Element(ns + "space_id"),
                        space_name = (string)e.Element(ns + "space_name"),
                        formal_name = (string)e.Element(ns + "formal_name"),
                        partition_id = (long)e.Element(ns + "partition_id"),
                        last_mod = (DateTime)e.Element(ns + "last_mod_dt")
                    };

            var space = q.First();
        }
    }
}

您可以將XmlRoot添加到您的類中,以聲明該元素的名稱空間:

[XmlRoot("space", Namespace = "http://www.collegenet.com/r25")]
public class Space
{
    public long space_id { get; set; }
    public string space_name { get; set; }
    public string formal_name { get; set; }
    public long partition_id { get; set; }
    public DateTime last_mod { get; set; }
}

解串器現在將正確讀取XML作為對象。

使用XSD工具生成類,然后使用XmlSerializer填充類。 像這樣。

MyClass myClass;
using (var stream = new FileStream("myClass.xml", FileMode.Open))
{
    var serializer = new XmlSerializer(typeof(MyClass));
    myClass = serializer.Deserialize(stream);
}

我找到了一個使用XML並創建適當的反序列化類的網站。 Xml2CSharp ,它創建了以下允許反序列化工作的類:

[XmlRoot(ElementName="partition_id", Namespace="http://www.collegenet.com/r25")]
public class Partition_id {
    [XmlAttribute(AttributeName="href", Namespace="http://www.w3.org/1999/xlink")]
    public string Href { get; set; }
    [XmlText]
    public string Text { get; set; }
}

[XmlRoot(ElementName="space", Namespace="http://www.collegenet.com/r25")]
public class Space {
    [XmlElement(ElementName="space_id", Namespace="http://www.collegenet.com/r25")]
    public string Space_id { get; set; }
    [XmlElement(ElementName="space_name", Namespace="http://www.collegenet.com/r25")]
    public string Space_name { get; set; }
    [XmlElement(ElementName="formal_name", Namespace="http://www.collegenet.com/r25")]
    public string Formal_name { get; set; }
    [XmlElement(ElementName="partition_id", Namespace="http://www.collegenet.com/r25")]
    public Partition_id Partition_id { get; set; }
    [XmlElement(ElementName="last_mod_dt", Namespace="http://www.collegenet.com/r25")]
    public string Last_mod_dt { get; set; }
    [XmlAttribute(AttributeName="crc")]
    public string Crc { get; set; }
    [XmlAttribute(AttributeName="status")]
    public string Status { get; set; }
    [XmlAttribute(AttributeName="href", Namespace="http://www.w3.org/1999/xlink")]
    public string Href { get; set; }
}

[XmlRoot(ElementName="spaces", Namespace="http://www.collegenet.com/r25")]
public class Spaces {
    [XmlElement(ElementName="space", Namespace="http://www.collegenet.com/r25")]
    public Space Space { get; set; }
    [XmlAttribute(AttributeName="xsi", Namespace="http://www.w3.org/2000/xmlns/")]
    public string Xsi { get; set; }
    [XmlAttribute(AttributeName="xl", Namespace="http://www.w3.org/2000/xmlns/")]
    public string Xl { get; set; }
    [XmlAttribute(AttributeName="r25", Namespace="http://www.w3.org/2000/xmlns/")]
    public string R25 { get; set; }
    [XmlAttribute(AttributeName="pubdate")]
    public string Pubdate { get; set; }
    [XmlAttribute(AttributeName="engine")]
    public string Engine { get; set; }
}

暫無
暫無

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

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