2010-03-09 60 views
0

我使用C#代碼更多或更少的這樣的序列化對象到XML:.NET XmlSerializer到Element FormDefault = Unqualified XML?

XmlSerializer xs1 = new XmlSerializer(typeof(YourClassName)); 
StreamWriter sw1 = new StreamWriter(@"c:\DeserializeYourObject.xml"); 
xs1.Serialize(sw1, objYourObjectFromYourClassName); 
sw1.Close(); 

我想它序列是這樣的:

<ns0:Header xmlns:ns0="https://mynamespace/"> 
    <SchemaVersion>1.09</SchemaVersion> 
    <DateTime>2009-12-15T00:00:01-08:00</DateTime> 

而是,它是這樣做的:

<Header xmlns="https://mynamespace/"> 
    <SchemaVersion xmlns="">V109</SchemaVersion> 
    <DateTime xmlns="">2010-03-08T18:21:09.100125-08:00</DateTime> 

它的序列化方式不適用於我計劃使用的XPath,並且與我的BizTalk模式不匹配。最初我使用BizTalk 2006架構中的XSD.exe構建類,然後使用它作爲WCF Web服務的參數。

這可能與一個稱爲元素FormDefault = Qualified或Unqualified的選項有關。在BizTalk中,我將模式設置爲「Unqualified」,這正是我想要的。

序列化程序是否有任何方式輸出「不合格」結果?

感謝,

尼爾·沃爾特斯

更新:關於日期時間

樣本屬性:

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public System.DateTime DateTime 
{ 
    get 
    { 
     return this.dateTimeField; 
    } 
    set 
    { 
     this.dateTimeField = value; 
    } 
} 

的BizTalk提供它稱之爲晉升(或區分)領域,其中使用XPath拉出個別元素的價值。我在名爲StylusStudio的工具中檢查了BizTalk的XPath,而Biztalk'x xpath與上面的xmlns =''字段無關。

我的WCF Web服務所做的第一件事是將對象序列化爲字符串(使用UTF16編碼)並將其存儲在SQL數據庫的XML列中。它是從那裏我看到上面的XML樣本與xmlns =「」。

的XPath:

/*[local-name()='Header' and namespace-uri()='https://mynamespace/']/*[local-name()='DateTime' and namespace-uri()=''] 
+0

你將哪些屬性應用於你的類和屬性? – 2010-03-09 18:36:43

+0

我在我的界面上使用[XmlSerializerFormat]。我希望類/屬性的屬性與xsd.exe生成的完全相同,因此我隨時可以更改模式和regen類。 – NealWalters 2010-03-09 18:43:43

+0

我使用DateTime屬性的樣本更新了原始帖子。 – NealWalters 2010-03-09 18:50:22

回答

0

我的問題有點混亂,所以這個答案可能會或可能不會幫助某人。 這是一個相當複雜的場景,我的一半問題來自於試圖簡化它以在這裏創建一個簡單的帖子。

我實際上正在用C#程序編程添加一個新元素(請參見下面的「NewElement」)。 C#代碼沒有將其名稱空間設置爲空字符串,因此我認爲它繼承了「Header」元素的名稱空間。

我嚇壞了,因爲我跳到了DateTime應該沒有「xmlns =」「'的結論,即使DateTime屬於Header,它也不應該也不應該繼承Header的命名空間

在BizTalk中,通常只有複雜類型有其自己的名稱空間,DateTime和NewElement都是簡單類型。

<Header xmlns="https://mynamespace/"> 
    <SchemaVersion xmlns="">V109</SchemaVersion> 
    <DateTime xmlns="">2010-03-08T18:21:09.100125-08:00</DateTime> 
    <NewElement>myvalue</NewElement> 

所以實際上,我發佈的兩個XML原來是一樣的,就XPath而言。如果我插入一個新的元素,我需要確保它遵循相同的模式。

我已經寫了C#例程來添加元素超過一年前,它工作得很好,所以我不懷疑它是造成這個問題。

0

你使用不匹配的XML命名空間的XPATH。例如,您的Header元素位於https://mynamespace/中,但您的XPATH正在搜索http://mynamespace/名稱空間。

+0

這是一個已經修復的錯字。就像我所說的,我試圖不包含完整的樣本 - 它太大了。我習慣用Stylus Studio進行測試,類似於XMLSpy,但還沒有在新客戶端上。但是發現這個:http://www.mizar.dk/XPath/Default.aspx。我現在正在測試,上面這個小例子看起來正在工作,還有我的真實數據,目前爲止還沒有工作。我需要幾分鐘的時間來進行實驗。昨天晚上,在Stylus Studio裏它不工作... – NealWalters 2010-03-09 19:25:52

+0

@Neal:固定在哪裏?這仍然是你的問題。順便說一句,我在XMLSpy中測試過,問題很明顯。 – 2010-03-09 19:44:52