2017-08-09 77 views
1

我正在使用.Net XmlSerializer將對象序列化爲C#Windows窗體應用程序中的XML文檔。如何刪除xmlns:xsd屬性,但保留xmlns:xsi

根元素應該結束了看起來像:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="file:///C:/data//MySchema.xsd"> 
    <!-- ... --> 
</root> 

在部分類(加入由xsd.exe創建的部分類),我已加入下列屬性添加xsi:noNamespaceSchemaLocation屬性。

[XmlAttribute("noNamespaceSchemaLocation", Namespace = XmlSchema.InstanceNamespace)] 
public string xsiNoNamespaceSchemaLocation = @"file:///C://data//MySchema.xsd"; 

,並刪除所有其他名稱空間,但保留xsi一個我用:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

,然後傳遞nsXmlSerializer.Serialize()方法。

這個工程到目前爲止,但我不知道這是否正確。感覺就像我在刪除默認設置中那樣,只是試着再添加一塊它......看起來像是一種代碼味道。

也許有更好的辦法,只刪除xsd,但離開默認xsi,所以我不需要再次將其添加回來?

注:有這個一個懸而未決的問題已經從一段時間回來here,唯一的建議答案不適合,因爲它消除雙方xsdxsi屬性。

+2

你所做的事對我來說看起來是正確的。你可以看看內部並看到'XmlSerializer'使用['DefaultNamespaces'](http://referencesource.microsoft.com/#System.Xml/System/Xml/Serialization/XmlSerializer.cs,34e80c7c306a0313)當沒有指定。這就是爲什麼你默認看到'xsi'和'xsd'的原因。 –

+0

@CharlesMager謝謝,看着我意識到我可以調整命名空間addtion:'ns.Add(「xsi」,XmlSchema.InstanceNamespace);' – Toby

+1

@CharlesMager讀了一點,似乎你的評論是FWIW ,如果你想讓它成爲答案,我會接受它。 – Toby

回答

1

你所做的事對我來說看起來是正確的。

你可以看看內部並看到XmlSerializer使用DefaultNamespaces時沒有指定。

這是一樣的,如果你是供應和xsixsdXmlSerializerNamespaces含前綴/命名空間,這就是爲什麼你看到的聲明xsixsd默認。

「刪除」xsd的正確做法是提供一個不包含該前綴/名稱空間的XmlSerializerNamespaces實例。

0

我也遇到過像你這樣的問題。我首先使用了linq,但沒有奏效。後來我發現了一個更好的工具XSLT。您可以使用XSLT,如Online