2017-07-31 64 views
0

如何在使用C#序列化對象到XML時在子級別元素上設置名稱空間?只有子元素的C#對象序列化爲XML名稱空間和前綴

我想這個落得作爲XML輸出的XML:

<clsPerson> 
    <FirstName>Jeff</FirstName> 
    <MI>J</MI> 
    <LastName>Jefferson</LastName> 
    <ns1:Addresses xmlns="www.whatever.co.uk"> 
    <Home>Here</Home> 
    <Work>There</Work> 
    </Addresses> 
</clsPerson> 

我正在使用的代碼大多是從其他疑問採取,並且是如下:

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

public class clsPerson 
{ 
    public string FirstName; 
    public string MI; 
    public string LastName; 

    [XmlElement(Namespace = "www.whatever.co.uk")] 
    public clsPlaces Addresses; 

     public clsPerson() 
     { 
     clsPlaces clsPlaces = new clsPlaces(); 
     } 
} 

[XmlRoot(Namespace = "")] 
public class clsPlaces 
{ 
public string Home { get; set; } 
public string Work { get; set; } 
    } 

class class1 
{ 
static void Main(string[] args) 
{ 
    clsPerson p = new clsPerson(); 
    var xml = ""; 
    p.FirstName = "Jeff"; 
    p.MI = "J"; 
    p.LastName = "Jefefrson"; 
    p.Addresses = new clsPlaces(); 
    p.Addresses.Home = "Here"; 
    p.Addresses.Work = "There"; 

    var emptyNamepsaces = new XmlSerializerNamespaces(new[] {  XmlQualifiedName.Empty }); 
    var serializer = new XmlSerializer(p.GetType()); 
    var settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    settings.OmitXmlDeclaration = true; 

    emptyNamepsaces.Add("ns", "www.whatever.co.uk"); 

    using (var stream = new StringWriter()) 
    using (var writer = XmlWriter.Create(stream, settings)) 
    { 
     serializer.Serialize(writer, p, emptyNamepsaces); 
     xml = stream.ToString(); 
    } 

     Console.WriteLine(xml) 
     Console.ReadLine(); 
    } 
} 

以上給出:

<clsPerson xmlns:ns="www.whatever.co.uk"> 
    <FirstName>Jeff</FirstName> 
    <MI>J</MI> 
    <LastName>Jefefrson</LastName> 
    <ns:Addresses> 
    <Home>Here</Home> 
    <Work>There</Work> 
    </ns:Addresses> 

如何才能獲取元素上的xmlns?我已經嘗試了所有我可以看到的搜索stackoverflow,並且無法找到/理解答案。

感謝

回答

0

刪除此 - 添加命名空間將確保前綴被添加到根:

emptyNamepsaces.Add("ns", "www.whatever.co.uk"); 

的地址聲明會得到自動添加。您還需要從clsPlaces刪除空命名空間,否則爲HomeWork的namspaces將是不正確的:然後

public class clsPlaces 
{ 
    public string Home { get; set; } 
    public string Work { get; set; } 
} 

輸出將是這樣的:

<clsPerson> 
    <FirstName>Jeff</FirstName> 
    <MI>J</MI> 
    <LastName>Jefefrson</LastName> 
    <Addresses xmlns="www.whatever.co.uk"> 
    <Home>Here</Home> 
    <Work>There</Work> 
    </Addresses> 
</clsPerson> 

的演示中看到this fiddle

+0

感謝您的快速回復,這真的非常接近我所需要的,但'code'

'code'需要有ns的前綴。我怎樣才能添加到只解決? (我不是所有人都知道XML的語義,如果這很重要,我也不確定接收這個請求的系統是如何符合的,所以真的想使它與我一直以來的例子一樣給出 – Richie

+0

@Richie遺憾的是,如果不仔細研究序列化的代碼,我不會指望你的當前輸出和修改後的輸出在語義上等價於你的示例輸出,所以任何解析器都不應該有任何問題與任一。 –

相關問題