2013-07-23 36 views
1

我連載的對象到XML和我得到的輸出像這樣:如何使用自定義命名空間連載

<?xml version="1.0" encoding="utf-8"?> 
<SOrd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

不過,我想它是像這樣:

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

如何我可以這樣做嗎?

我曾嘗試加入串行化之前的屬性根對象,也這樣:

XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces(); 
xmlNameSpace.Add("xmlns:SOrd", "http://..."); 
xmlNameSpace.Add("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
xmlNameSpace.Add("xsi:schemaLocation", "http://....xsd"); 

XmlSerializer xs = new XmlSerializer(ord.GetType()); 
TextWriter writer = new StreamWriter(outputPath, false); 
xs.Serialize(writer, ord, xmlNameSpace); 
writer.Close(); 

但我得到的異常「在‘:’字符,十六進制值0x3A,不能包含在$名稱「。

回答

2

的prefic不能包含「:」,拿出第一部分的xmlns:

這裏是你的代碼性能稍微改變:

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

XmlSerializer xs = new XmlSerializer(ord.GetType()); 
TextWriter writer = new StreamWriter(outputPath, false); 
xs.Serialize(writer, ord, xmlNameSpace); 
writer.Close(); 

確保添加所需的屬性,每個因爲序列化屬性沒有被插入。更多關於屬性的inheretence檢查:How to deserialize concrete implementation of abstract class from XML

編輯

可以實現XSI:shcemaLocation就像是:

[XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar", DataType = "schemaLocation")] 
    public class Foo 
    { 
    [System.Xml.Serialization.XmlAttributeAttribute(AttributeName = "schemaLocation", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
    public string schemaLocation = "http://example"; 
    } 
+0

我只是做這個之前,我看了你的消息,它的工作原理,但schemaLocation需要有一個xsi的前綴:我該如何實現這一點? – sprocket12

+0

感謝它的工作原理:)最後一件事情是有可能以certail方式訂購模式定義?當輸出 – sprocket12

+0

時他們似乎混在一起我認爲這是不可能的,或者至少我不知道這種方式。如果使用XmlWriter創建文檔,則免除。 – Swift

相關問題