.NET(C#):覺察XML還原序列化中的未知節點

來源:互聯網
上載者:User

眾所周知XML是可以擴充的,XML的元素可以靠名稱識別而不是只按照未知識別。在XML還原序列化的時候只要需要的資訊存在就可以成功將XML資料轉化成還原序列化後的對象。但是這並不代表著用來還原序列化的XML資料就一定是序列化的標準結果。有些時候XML資料會有多餘冗長資訊,這個在還原序列化的過程中預設是不會被覺察到的。

 

XmlSerializer類型有三個事件可以覺察到未知XML節點:UnknownNode,UnknownElement和UnknownAttribute。分別對應未知節點,未知元素和未知屬性。注意XML元素和XML屬性都屬於XML節點。

比如這個類型:

public class Worker

{

    public int Id;

    [XmlAttribute]

    public bool Retired;

}

 

本只包括一個元素(Id)和屬性(Retired),但XML資料中還有其他冗長資訊:

<?xml version="1.0" encoding="utf-8" ?>

<Worker xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xmlns:xsd="http://www.w3.org/2001/XMLSchema"

        Retired="false"

        Department="sales">

    <Name>Mgen</Name>

    <Id>17</Id>

</Worker>

 

註冊XmlSerializer的相應事件然後還原序列化操作:

var xmlSerializer = new XmlSerializer(typeof(Worker));

xmlSerializer.UnknownNode += (sender, e) =>

{

    Console.WriteLine("未知節點:{0} 行{1} 列{2}", e.Name, e.LineNumber, e.LinePosition);

};

 

xmlSerializer.UnknownAttribute += (sender, e) =>

{

    Console.WriteLine("位置屬性:{0} 行{1} 列{2}", e.Attr.Name, e.LineNumber, e.LinePosition);

};

xmlSerializer.UnknownElement += (sender, e) =>

{

    Console.WriteLine("位置元素:{0} 行{1} 列{2}", e.Element.Name, e.LineNumber, e.LinePosition);

};

 

//還原序列化XML檔案

var worker = (Worker)xmlSerializer.Deserialize(File.OpenRead("xmlfile.xml"));

 

輸出:

未知節點:Department 行5 列21

位置屬性:Department 行5 列21

未知節點:Name 行7 列6

位置元素:Name 行7 列6

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.