簡體   English   中英

使用c#中的子元素反序列化xml文件

[英]Deserialize a xml file with child elements in c#

我正在嘗試反序列化這種類型的 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<Network>
 <ROUTES>
  <ROUTE ID="RT_BALA_GLNC_R_162_154_1" DIRECTION="LEFT" ZONE="Richmond_Hill">
     <ENTRANCESIGNAL>BALA_GLNC_G162</ENTRANCESIGNAL>
     <EXITSIGNAL>BALA_DONS_G154</EXITSIGNAL>
     <POINTENDIDS>
        <POINTENDID POS="N">PT_BALA_GLNC_W11.TrackPortionConnection</POINTENDID>
        <POINTENDID POS="N">PT_BALA_GLNC_W23.TrackPortionConnection</POINTENDID>
     </POINTENDIDS>
  </ROUTE>
  <ROUTE ID="RT_BALA_ORLS_R_111_119_1" DIRECTION="RIGHT" ZONE="Richmond_Hill">
     <ENTRANCESIGNAL>BALA_ORLS_G111</ENTRANCESIGNAL>
     <EXITSIGNAL>BALA_ORLN_G119</EXITSIGNAL>
     <POINTENDIDS>
        <POINTENDID POS="N">PT_BALA_ORLS_W1.TrackPortionConnection</POINTENDID>
     </POINTENDIDS>
  </ROUTE>
  <ROUTE ID="RT_BALA_GLNC_R_162D_154_1" DIRECTION="LEFT" ZONE="Richmond_Hill">
     <ENTRANCESIGNAL>BALA_GLNC_G162D</ENTRANCESIGNAL>
     <EXITSIGNAL>BALA_DONS_G154</EXITSIGNAL>
     <POINTENDIDS>
        <POINTENDID POS="R">PT_BALA_GLNC_W11.TrackPortionConnection</POINTENDID>
        <POINTENDID POS="N">PT_BALA_GLNC_W23.TrackPortionConnection</POINTENDID>
     </POINTENDIDS>
  </ROUTE>
 </ROUTES>
</Network>

我試過這個

class Program
{
    static void Main(string[] args)
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(Network));
        TextReader reader = new StreamReader(@"xml File Location");
        object obj = deserializer.Deserialize(reader);
        Network XmlData = (Network)obj;
        reader.Close();
        Console.ReadLine();
    }
}
[XmlRoot("Network")]
public class Network
{
    [XmlElement("ROUTES")]
    public List<ROUTE> ROUTES { get; set; }
}

public class ROUTE
{
    [XmlAttribute("ID")]
    public string ID { get; set; }
    [XmlAttribute("DIRECTION")]
    public string DIRECTION { get; set; }
    [XmlElement("ENTRANCESIGNAL")]
    public string ENTRANCESIGNAL { get; set; }
    [XmlElement("EXITSIGNAL")]
    public string EXITSIGNAL { get; set; }
    [XmlElement("POINTENDIDS")]
    public POINTENDIDS POINTENDIDS { get; set; }
}

public class POINTENDIDS
{
    [XmlElement("POINTENDID")]
    public List<POINTENDID> POINTENDID { get; set; }
}

public class POINTENDID
{
    [XmlAttribute("POS")]
    public string POS { get; set; }
}

我是在控制台應用程序中做的,

我開始調試並在 Network XmlData = (Network)obj; 上放置斷點;

我只有 1 個 ROUTES,並且“ID”、“DIRECTION”、“ENTRANCESIGNAL”...等的值設置為 Null

作為 c# 編程的初學者,我真的不明白我該怎么辦!

此實施需要幫助

修復您的網絡類。 方括號中的名稱區分大小寫。 您還需要添加 Xml 數組屬性。

    [XmlRoot("Network")]
    public class Network
    {
        [XmlArrayItem("ROUTE")]
        [XmlArray("ROUTES")]
        public List<ROUTE> ROUTES { get; set; }
    }
using System.Xml; //XmlDoc
using System.Xml.Linq;//XElement
using System.IO;//Path,File,Directory, Stream

讀取並解析xml文件:

XmlDocument XmlDoc = new XmlDocument();
XmlDoc.Load(XmlFilePath);

另一種方法是使用XElement代替:

XElement a = XElement.Load(@"c:\path\file");

大多數情況下,我更喜歡 XElement 而不是 XmlDocument,但那是個人的

如果您從 C# 開始,您需要一本書和一個更簡單的項目。 Streams 和 Xml 在語法上很復雜。 此外,控制台應用程序很丑陋,並且使用 VisualStudio 的圖形工具來處理 Forms 應用程序並不難。

您的 C# 類與 XML 文件不完全一致,序列化程序僅返回部分結果。 如果 XML 結構是固定的,您可以做些什么來代替這里概述。

https://stackoverflow.com/a/17315863/99804

然后這會按您的意願工作。

您將獲得以下自動生成的代碼。 注意:我已經清理了輸出以使用自動屬性等。

using System;
using System.Xml.Serialization;

// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
/// <remarks />
[Serializable]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public class Network
{
    /// <remarks />
    [XmlArrayItem("ROUTE", IsNullable = false)]
    public NetworkROUTE[] ROUTES { get; set; }
}

[Serializable]
[XmlType(AnonymousType = true)]
public class NetworkROUTE
{
    [XmlAttribute]
    public string DIRECTION { get; set; }

    public string ENTRANCESIGNAL { get; set; }

    public string EXITSIGNAL { get; set; }

    [XmlAttribute]
    public string ID { get; set; }

    [XmlArrayItem("POINTENDID", IsNullable = false)]
    public NetworkROUTEPOINTENDID[] POINTENDIDS { get; set; }

    [XmlAttribute]
    public string ZONE { get; set; }
}

[Serializable]
[XmlType(AnonymousType = true)]
public class NetworkROUTEPOINTENDID
{
    [XmlAttribute]
    public string POS { get; set; }

    [XmlText]
    public string Value { get; set; }
}

暫無
暫無

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

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