2011-10-17 6 views
3

のXmlSerializerを使用して文書をデシリアライズ正しくXmlSerializerを使用してXML文書を名前空間で非直列化するにはどうすればよいですか?

ドキュメント

<?xml version=\"1.0\"?> 
<ns0:ElementA xmlns:ns0=\"urn:some-namespace\"> 
    <Prop1>Some Value</Prop1> 
    <Prop2>Some other value</Prop2> 
</ns0:ElementA> 

クラス

[XmlRoot(Namespace = "urn:some-namespace")] 
public class ElementA 
{ 
    [XmlElement] 
    public string Prop1 { get; set; } 

    [XmlElement] 
    public string Prop2 { get; set; } 
} 

PROP1とPROP2の両方が、デシリアライゼーションの末尾のヌルされ、デシリアライズされていません。

ドキュメントの構造を変更して名前空間を取り除くことができないため、私は自分の側で正しく直列化を処理する必要があります。

文書は、私が正しく直列化復元を処理するためにElementAの属性を設定する必要がありますどのように再現

の目的のために簡素化されました?

- ここでは、問題を再現するための完全なコードです -

namespace ConsoleApplication1 
{ 
    using System; 
    using System.IO; 
    using System.Xml.Serialization; 

    public class Program 
    { 
     [XmlRoot(Namespace = "urn:some-namespace")] 
     public class ElementA 
     { 
      [XmlElement] 
      public string Prop1 { get; set; } 

      [XmlElement] 
      public string Prop2 { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      var element = 
       "<?xml version=\"1.0\"?>" + Environment.NewLine + 
       "<ns0:ElementA xmlns:ns0=\"urn:some-namespace\">" + Environment.NewLine+     " <Prop1>Some Value</Prop1>" + Environment.NewLine + 
       " <Prop2>Some other value</Prop2>" + Environment.NewLine + 
       "</ns0:ElementA>"; 

      XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(ElementA) })[0]; 
      ElementA result; 

      using (var reader = new StringReader(element)) 
      { 
       result = serializer.Deserialize(reader) as ElementA; 
      } 

      Console.WriteLine("Prop1: " + result.Prop1); 
      Console.WriteLine("Prop2: " + result.Prop2); 
      Console.ReadKey(); 
     } 
    } 
} 
+2

ランダムな考え方 - プロパティで '[XmlElement(Namespace =" ")]'を試してみましたか? –

+0

@Marc、それはまさに何が行われる必要があります。これを回答として投稿することができます。 –

+0

@ダリン - 私はモバイルで、検証する立場にはないので、私は答えとして投稿しませんでした(私は合理的に答えに自信を持っているのが好きです)。ところで、あなたが私を追い越す前に私は数ヶ月しか残っていないように見えます; p –

答えて

13

もともと私はそれを確認していないので、コメントとして投稿、しかし:

<Prop1>Some Value</Prop1> 

ではありませんだから、作業を取得するために同じ

として
<ns0:Prop1>Some Value</ns0:Prop1> 

、あなたはおそらく必要があります。

[XmlElement(Namespace="")] 
public string Prop1 { get; set; } 

[XmlElement(Namespace="")] 
public string Prop2 { get; set; } 
+0

指示どおりに動作します。私は間違って名前空間を設定しないままにすることは、 ""に設定するのと同じだと誤って想定していました。明らかに、私は間違っていた。 – angrifel

+0

迅速な対応に感謝します! – angrifel

+1

@Felipe "not specified"は、 "element-nameにmember-nameを使用し、親から名前空間を継承する"ことを意味します。 –

関連する問題