2012-04-26 126 views
4

我有我需要用XmlSerializer反序列化的xml(我無法控制)。我的麻煩是我需要在一個列表中保存兩個不同標籤之間的順序。讓我舉一個例子:Xml反序列化,在不同標籤間執行命令

<users> 
    <luser>..some more elements..</luser> 
    <luser>..some more elements..</luser> 
    <admin>..different elements than in luser</admin> 
    <luser>..some more elements..</luser> 
    <admin>..different elements than in luser</admin> 
    <luser>..some more elements..</luser> 
    <admin>..different elements than in luser</admin> 
<users> 

現在,如果我deserialze這個直接的方式,我結束了兩個列表,一個用於LUSERS,一個用於管理員。但是,它們出現的順序是隱式ID! (當然應該已經在XML屬性或元素,但可惜它不是)

我試圖做一個meta元素這樣

[XmlElement("luser"),XmlElement("admin")] 
public List<Person> Person { get; set; } 

public class Person 
{ 
    public Luser Luser { get; set; } 
    public Admin Admin { get; set; } 
} 

計劃是檢查列表以查看是否輸入luser或管理員,並讓人員包裝維護元素的順序。但是,單個屬性上的多個XmlElement屬性似乎是非法的。

另一個可以接受的解決方案是最終得到兩個列表,但每個列表中的每個條目都有一個我可以用來獲取原始順序的ID。

我希望這個儘可能乾淨。之後搜索xml以查找訂單,手動提取標籤以及類似內容,這是我會避免的,並且是最後一招。

+0

我知道它並不能真正幫助你,但它似乎很愚蠢,你需要讓它們保持秩序。顯然似乎沒有任何模式來規定這種安排。你爲什麼不能讓所有的用戶跟隨所有的管理員?這是你的系統強加的約束,還是其他一方要求你不要改變列表?也看看這個,它可能會給你一些想法:http://stackoverflow.com/questions/1007626/in-net-xml-deserialization-how-can-i-allow-polymorphic-use-of-array-類型 – Thomas 2012-04-26 14:50:10

+0

第一個條目(用戶或管理員)是id 1,下一個是id 2(無論是用戶還是管理員)等等。是的,這很愚蠢,但我無能爲力。我會查看鏈接,謝謝 – Toodleey 2012-04-26 15:16:19

+0

Ew,userIds是基於XML文檔中的位置?這太可怕了。我想這是不可能的,以使得userId是一個屬性? – Thomas 2012-04-26 15:19:59

回答

4

這當然應該是一個屬性...

然後只要你可以把它的屬性。然後處理結果。

var doc = XDocument.Load(...); 

var fixeruppers = doc 
     .Descendants("users") 
     .Elements() 
     .ToList(); // isolate us from any movements in the doc 

int id = 1; // base 
foreach (var fixer in fixeruppers) 
    fixer.SetAttributeValue("Id", id++); 

XmlReader readerForDeserialize = doc.CreateReader(); 
+0

+1。訂單不被保留的原因是XML中沒有這樣的訂單 - 你需要一個,你有一個。誰做錯了誰是可以迴避的 - 沒有辦法解決這個問題。添加一個ID。 – TomTom 2012-04-26 15:00:36

+0

多數民衆贊成這是目前爲止最乾淨的方式,雖然它感覺有點哈克它肯定會反序列化整個手動或其他事情已經跨過我的腦海 – Toodleey 2012-04-26 15:17:54

+1

主要觀點是要做到這一點,並跨越你的手指。大多數XML工具/解析器都不會覺得有義務維護任何'訂單'。還要注意XDocument.CreateReader(),你可以連接大多數的反序列化器。 – 2012-04-26 15:52:24

-2

以下內容將規定順序(順序爲:=值),但不會改變類的序列化方式。

Imports System.Runtime.Serialization 
Imports System.ServiceModel 

<DataContract()> _ 
Public Class MyClass 

    <DataMember(order:=1)> _ 
    Public Property SomeData() As String 

    <DataMember(order:=2)> _ 
    Public Property SomeOtherData() As String 

End Class