2011-04-14 65 views
1

我需要根據網絡服務規範序列化一些Xml。由於某些原因,我創建了幾個不同的類來封裝我的應用程序的信息。這些類不直接與xml模式匹配。見下文。使用.Net XmlSerializer,有什麼辦法可以省略根級標籤嗎?

<TopLevel> 
    <InfoString>Value</InfoString> 
    <InfoInt>242</InfoInt> 
    <Etcetera>Value2</Etcetera> 
</TopLevel 

雖然我的類是這樣的:

public class Info 
    -InfoString 
    -InfoInt 
public class Etcetera 
    -EtceteraValue 

這將產生不正確XML,因爲是包含InfoStrings元素信息,以及諸如此類元素包含EtceteraValue。

我實現了IXmlSerializable,但XmlSerializable仍寫入我的類的根級別。有任何想法嗎?

爲了清楚起見:我試圖將多個類序列化到相同級別的同一文檔中。

+0

看看這篇文章,看看如何設置你的類的屬性:http://msdn.microsoft.com/en-us/library/ms733901.aspx – 2011-04-14 14:45:10

回答

1

如果您需要對xml輸出進行良好控制,並將完全獨立的對象類合併爲單個XML,則可以考慮使用XmlWriter,或手動編寫XML。

我不知道如何使用純屬性標記來加入這些類來控制序列化。

+0

甚至一個TagBuilder。 – gt124 2011-04-14 15:04:47

+0

TagBuilder是爲HTML,而不是XML,你需要MVC框架,如果你的意思是這個TagBuilder – codymanix 2011-04-14 15:17:38

3

我不相信這是可能的,因爲這種方式的序列化器可以產生xml,它不能被反序列化明確,如果多個類有一個同名的屬性。

您可以自行完成序列化或使用XSLT將輸出轉換爲您需要的xml格式。

我過去的做法是創建傳輸類,它們具有正確的序列化結構以完全符合我想要的格式。您只需將原始對象中的值填入傳輸對象。

編輯另一個想法:

可以查詢在您使用LINQ,表達你的對象所需的格式的所有數據。之後,您可以使用LINQ to XML將結果序列化爲xml。我從來沒有這樣做過,如果你有運氣,請讓我知道。

0
public class RootClass 
    { 
     public Info info { get; set; } 
     public Etcetera etc { get; set; } 
    } 

    public class Info 
    { 
     [XmlElement] 
     public string InfoStr { get; set; } 
     [XmlElement] 
     public int InfoInt { get; set; } 
    } 

    public class Etcetera 
    { 
     [XmlElement] 
     public string EtceteraValue { get; set; } 
    } 

然後序列化RootClass

這會給你:

<?xml version="1.0"?> 
<RootClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<info> 
    <InfoStr>asdf</InfoStr> 
    <InfoInt>1</InfoInt> 
</info> 
<etc> 
    <EtceteraValue>etc</EtceteraValue> 
</etc> 

+0

OP說,這種方法確實不起作用,那又如何? – codymanix 2011-04-14 14:54:58

+0

@codymanix我明白了,我的印象是他的輸出不是他預期的結果,我的不好! – 2011-04-14 14:59:01

0

要麼你:

  1. 拼合類,所以序列化符合您的需求架構。
  2. 創建一個新的扁平類,並使用一些映射框架,以你的結構化類和扁平serailizable類之間進行映射,像Value Injecter
  3. 不要修改類型定義,並嘗試使用XSLT
修改XML
相關問題