2017-07-31 31 views
0

C#でオブジェクトをXMLにシリアル化する際に、子レベルの要素で名前空間セットを取得するにはどうすればよいですか?子要素のXML名前空間と接頭辞へのC#オブジェクトのシリアライズ

私は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"); 

アドレスのための宣言が自動的に追加されます。あなたはまた、他のHomeWorkためnamspacesが不正確になり、clsPlacesから空の名前空間を削除する必要があります。

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残念ながら、シリアル化を手作業で記述するのでなければ、実際には可能ではありません。現在の出力と私の修正された出力は、意味的にあなたの出力例と等価であるので、どちらかと。 –

関連する問題