2013-07-23 2 views
0

person에 관한 정보를 포함하는 두 개의 동일한 XML 파일이 있습니다. 태그 이름 만 다릅니다. 예를 들어 첫번째, 난xml을 객체로 비 직렬화

<name> 
<surname> 
<address>... 

있고 두 번째로, 내가 vb.net 두 별도 개체로 "역 직렬화"필요

<name_person> 
<surname_person> 
<address_person> 

있다. 이름, 성, 주소 속성이 하나만있는 클래스가 있습니다. 두 번째 XML 파일에도이 클래스를 사용할 수 있습니까? 이는 후자의 태그 이름이 일치하지 않기 때문입니다.

감사

+0

File-> String-> XMLObject를 사용하는 경우 문자열 함수를 사용하여 태그를 수정할 수 있습니다. – rheitzman

+0

내 속성 클래스에서 읽을 수있는 파일 형식을 결정하고 검색 할 태그 이름을 알릴 수 있습니까? 예 : 만약 FileName = "xml1"이면 _ else _ – user2092583

답변

0

당신은 당신이 지정할 수 SerializationBinder (다시 매핑) 요소의 유형이 직렬화 복원되는을 사용할 수 있어야합니다.

1

가장 쉬운 방법은 개별적으로 직렬화를 제어하는 ​​것입니다. XmlElement 특성에 대한 별칭을 찾았지만 비슷한 것을 보지 못했습니다. 또한 객체를 다시 직렬화하면 사용할 태그를 어떻게 알 수 있습니까?

두 번째 개체에서 deserialize하면 코드에서 첫 번째 클래스의 새 인스턴스를 만들고 속성을 복사하는 것이 어렵지 않습니다.

이렇게하면 독서 능력이 뛰어난 수업을 만들 수 있지만이 수업을 쓰기에는 사용하지 말아야합니다. 그렇지 않으면 모든 속성이 작성됩니다.

VB.NET

<XmlRoot("PersonList")> _ 
Public Class PersonList 
    <XmlElement("person")> _ 
    Public Property People() As Person() 
     Get 
      Return m_People 
     End Get 
     Set 
      m_People = Value 
     End Set 
    End Property 
    Private m_People As Person() 
End Class 

Public Class Person 
    Private _name As String 

    <XmlElement("name")> _ 
    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set 
      _name = value 
     End Set 
    End Property 

    <XmlElement("name_person")> _ 
    Public Property NamePerson() As String 
     Get 
      Return _name 
     End Get 
     Set 
      _name = value 
     End Set 
    End Property 

End Class 

C#을

[XmlRoot("PersonList")] 
public class PersonList { 
    [XmlElement("person")] 
    public Person[] People { get; set; } 
} 

public class Person { 
    private String _name; 

    [XmlElement("name")] 
    public String Name {get{return _name;} set{_name = value;}} 

    [XmlElement("name_person")] 
    public String NamePerson {get{return _name;} set{_name = value;}} 

} 

참조 : 원본 클래스를 사용하지만, 다음 XmlSerializer.UnknownElement 이벤트를 처리 할 수있는 것처럼 XML deserialize: different xml schema maps to the same C# class

다른 방법으로는, 그것은 보인다.

(안된) VB.Net는

Private Shared Sub serializer_UnknownElement(sender As Object, e As XmlElementEventArgs) 
    Dim target = DirectCast(e.ObjectBeingDeserialized, Person) 
    If e.Element.Name = "name_person" Then 
     target.Name = e.Element.InnerText 
    End If 
End Sub 

C#

static void serializer_UnknownElement(object sender, XmlElementEventArgs e) 
{ 
    var target = (Person) e.ObjectBeingDeserialized; 
    if(e.Element.Name == "name_person") 
    { 
     target.Name = e.Element.InnerText; 
    } 
} 

그러나 다시, 이것은 당신이로 이전 형식에서 이전 형식으로 다시에만 부하를 저장하지 것이다 새로운 수업.

참조 : http://weblogs.asp.net/psteele/archive/2011/01/31/xml-serialization-and-the-obsolete-attribute.aspx

참조 : http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.unknownelement.aspx

+0

정말 감사합니다. 설명은 매우 명확합니다. – user2092583

+0

나는 사람은 바인더를 무시하고 여전히 mybase를 반환합니다. – user2092583

0

당신은 당신이 기대하고있는 요소 이름과 일치하는 두 번째 문서를 업데이트 할 XSLT를 사용할 수 있습니다. 그렇게하면 코드에서 다른 요소 이름을 처리 할 필요가 없습니다.

는 XSLT를 사용하여 두 번째 문서를 변환, 뭔가 같은 :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="//name_person"> 
    <name> 
    <xsl:apply-templates select="@*|node()" /> 
    </name> 
    </xsl:template> 
    <xsl:template match="//surname_person"> 
    <surname> 
     <xsl:apply-templates select="@*|node()" /> 
    </surname> 
    </xsl:template> 
    <xsl:template match="//address_person"> 
    <address> 
     <xsl:apply-templates select="@*|node()" /> 
    </address> 
    </xsl:template> 
</xsl:stylesheet> 

그것은 C#으로, 문서에 프로그래밍 방식이 적용, 당신은 할 수 : VB에서

XslCompiledTransformtransform = new XslCompiledTransform(); 
transorm.Load("update.xsl"); 
transorm.Transform("source.xml","new.xml"); 

:

Dim transform As XslTransform 
transform = New XslTransform() 
transform .Load("update.xsl") 
transform .Transform("source.xml", "new.xml") 

그 결과는 두 문서에서 요소 이름이 일치하므로 사용자를 실행할 수 있습니다 r deserializer를 사용하여 불일치 요소 이름을 처리 할 필요가 없습니다.