2012-10-15 63 views
0

我知道,它看起來並不像最好的做法,但我需要用相同的命名空間序列化XML具有相同的默認命名和命名空間

例如生成XML:

<ns1:root xsi:schemaLocation=""http://schemalocation"" 
xmlns:ns1=""http://schema"" 
xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
xmlns=""http://schema""> 
... 
</ns1:root> 

我還添加了命名空間串行:

var xmlSerializerNamespaces = new XmlSerializerNamespaces(); 
xmlSerializerNamespaces.Add("ns1", "http://schema"); 
xmlSerializerNamespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
xmlSerializerNamespaces.Add(string.Empty, "http://schema"); 

這是類本身:

[XmlRoot(ElementName = "request", Namespace = "http://schema")] 
    [Serializable] 
    public class Request 
    { 
     [XmlAttributeAttribute("schemaLocation", Namespace = XmlSchema.InstanceNamespace)] 
     public string SchemaLocation 
     { 
      get { return _schemaLocation; } 
      set { _schemaLocation = value; } 
     } 

     ... 

     private string _schemaLocation = "http://schemalocation"; } 

所以一切都很好,但默認的xmlns不在生成的xml中。 我也玩過XmlWriterSettings,沒有結果。 有沒有人想法如何做到這一點沒有字符串替換?)

回答

0

默認命名空間是根據您用來添加XML片段的名稱空間來設置的,例如,

XNamespace defaultNs = @"http://schema"; 
var result = new XDocument(new XElement(defaultNs + "root")); 

會產生以下輸出:

<rootNode xmlns="http://schema"> 
</rootNode> 

因此,所有你需要做的就是你的其他命名者添加到文檔即

XNamespace defaultNs = @"http://schema"; 
var root = new XElement(defaultNs + "root", 
    new XAttribute("xsi", "schemaLocation", "http://schemaLocation"), 
    new XAttribute(XNamespace.Xmlns + "ns1", defaultNs"), 
    new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance") 
); 
+0

謝謝,我同意這是一個解決方案,但我需要使用xmlserialization從屬性類到XML和使用一個更多的對象(XDocument)是不好,尤其是當你有大的XML。你知道很熱來避免它嗎? –

相關問題