2008-11-21 21 views
1

下面的問題是關於要用於數據交換的類型的.net庫的XML序列化/反序列化和模式驗證。.NET中的Xml序列化和模式(C#)


第一個問題,如果我有一個自定義XML命名空間說「http://mydomain/mynamespace」我必須一個

[XmlRoot(Namespace = "http://mydomain/mynamespace")] 

添加到每個班級在我的圖書館。或者有沒有辦法將這個命名空間定義爲整個程序集的默認值?


第二個問題,有沒有總是添加命名空間

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

即使有任何命名空間沒有實際參考後面的原因是什麼?我只是覺得它們會給產生的xml增加噪音。有沒有辦法刪除它們只有在生成的XML中的自定義名稱空間?


第三個問題,是有支持的模式定義生成(例如,用於所有公共[Serializable接口]類的程序集),並針對特定模式的XML提供的驗證工具?

如果有,您會推薦來自W3C或RELAX NG的XML Schema嗎?

回答

3

只需添加 - 「xsi」等支持xsi:nil之類的值 - 以後的值爲可爲空的值的衆所周知的模式。它必須寫流「只轉發」,它不知道(當它寫第一位時)是否需要nil,所以它假設不必要地寫一次比使用完整的名稱空間要好可能很多次。

2

1)XmlRoot只能在類/結構體/接口級(或返回值)上設置。所以你不能在裝配層面上使用它。你要找的是XmlnsDefinitionAttribute,但我相信只有XamlWriter才能使用它。

2)如果你擔心混亂,你應該避免xml。格式良好的XML充滿了混亂。我相信有一些方法可以與串行器生成的xml進行交互,但不能直接與XmlSerializer進行交互。您對使用XmlWriter類生成的XML有更多的控制權。 Check here for how you can use the XmlWriter to handle namespaces.

3)XSD.exe可用於生成波蘇斯模式,我相信(我總是手寫他們,我可能很快會用這個寫上去地段,THO)!

0

工具, - XSD.EXE,有一個命令行類似

xsd /c /n:myNamespace.Schema.v2_0 myschema_v2_0.xsd 

我把架構在一個單獨的項目。

liqudXML如果存在多個模式,或者您希望完全支持模式功能(帶有偏移量的日期時間,正/負小數)以及跨平臺生成,那麼它很有用。