2016-08-20 7 views
0

지난 한 주 동안 .NET 코어 netcoreapp1.0 (net451)으로 응용 프로그램을 업그레이드했습니다. 프로세스의 대부분은 매우 잘 진행되었으며 모든 것이 내가보고있는 마이너스 한 가지 문제로 넘어갔습니다..NET 코어에서 알 수없는 특성의 XML serialization

API 끝점 (전적으로 제어 할 수 없음)에서 XML을 serialize하려면 System.XmlSystem.Xml.Serialization을 사용하고있었습니다. 잘 작동했지만 XML 관련 문제로 인해 항상 UnknownAttribute으로 돌아간 하나의 속성이있었습니다. 나는이 같은 UknownAttribute 이벤트에 배선하여 처리 :

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; 
} 

을 .NET 코어로 업그레이드으로, 내가 지금 System.Xml.XmlSerializer 4.0.11 라이브러리를 사용합니다. 이제 UnknownAttribute 이벤트가 더 이상 XmlSerializer의 일부가 아닌 것으로 보입니다. 나는 알 수없는 속성을 처리 할 다른 방법을 찾을 수 없었고 올바른 방향으로 포인터를 알게되었습니다.

+0

문서 [여기] (https://docs.microsoft.com/en-us/dotnet/core/api/system.xml.serialization.xmlanyattribute 속성)에서 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을 사용합니다.