2016-08-20 15 views
0

私はアプリケーションを.NETコアnetcoreapp1.0net451からアップグレードしています。プロセスの大部分は非常にうまくいって、私が見ているマイナス1つの問題にすべてが移植されています。.NETコアで未知の属性のXMLシリアル化

私はSystem.XmlSystem.Xml.Serializationを使用してAPIエンドポイント(これは私が全く制御できません)からXMLをシリアライズしました。それはうまくいっていましたが、XMLに関する問題のために、いつもUnknownAttributeという1つの属性が戻ってきました。私は今System.Xml.XmlSerializer 4.0.11ライブラリを使用し、.NETのコアへのアップグレードでは

XmlReader reader = XmlReader.Create(stream); 
var serializer = new XmlSerializer(typeof(PersonDetails)); 

var personDetails = (PersonDetails)serializer.Deserialize(reader); 

serializer.UnknownAttribute += new XmlAttributeEventHandler((object sender, XmlAttributeEventArgs e) => { 
    unknownAttr.Add(e.Attr.Name, e.Attr.Value); 
}); 

// Handle the missing map value if it exists. 
string addressValue; 
if(unknownAttr.TryGetValue("Address_x0_", out addressValue)) 
{ 
    personDetails.Address = addressValue; 
} 

:私はこのような​​イベントに配線でそれを処理していました。今、UnknownAttributeイベントはもはやXmlSerializerの一部ではないようです。私は未知の属性を扱う別の方法を見つけることができず、正しい方向にポインタを感謝するでしょう。

+0

ドキュメント[ここ](https://docs.microsoft.com/en-us/dotnet/core/api/system.xml.serialization.xmlanyattributeattribute)から、dotnetcoreはまだ['XmlAnyAttributeAttribute']をサポートしていますhttps://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlanyattributeattribute.aspx)。 '[XmlAnyAttribute]'プロパティを 'PersonDetails'クラスの[C#で属性のリストを持つ要素を逆直列化する方法](https://stackoverflow.com/questions/32884364)の行に沿って、内部のあなたの未知の属性のために。 – dbc

+0

ありがとう@dbc。私はそれを見ましたが、その例を試してみると、 'XmlAttribute []'は型ではありません。私が図書館を紛失しているのか、何かがひどく壊れているのかどうかは分かりません。私は 'XmlAttributeAttribute'、' XmlAttributes'、および 'XmlAttributeOverrides'を持っています。 'XmlAttribute'で他に何もありません。何か案が?編集:私もここにそれを参照してください:https://docs.microsoft.com/en-us/dotnet/core/api/system.xml#System_Xml_XmlAttribute、それを使用しようとするとコンパイルされません。 – JasCav

+0

これが必要な場合があります:https://www.nuget.org/packages/System.Xml.XmlDocument/ – dbc

答えて

2

ではなく、未知の属性イベントを使用して、あなたは、あなたのPersonDetailspublic XmlAttribute[] XmlAttributesプロパティを追加[XmlAnyAttribute]でそれをマークし、そこに未知の属性を処理することができます:

public class PersonDetails 
{ 
    [XmlAttribute] 
    public string Address { get; set; } 

    [XmlAnyAttribute] 
    public XmlAttribute[] XmlAttributes 
    { 
     get 
     { 
      return null; 
     } 
     set 
     { 
      if (value != null) 
      { 
       foreach (var attr in value) 
        if (attr.Name == "Address_x0_") 
         Address = attr.Value; 
      } 
     } 
    } 
} 

あなたが見られるように、あなたが追加する必要がありますhttps://www.nuget.org/packages/System.Xml.XmlDocument/を使用して.NETコアにXmlAttributeを使用してください。

関連する問題