데이터베이스에서 생성 된 일부 엔터티가 있으며이를 XML로 직렬화하고 싶었습니다. 문제는 일부 엔터티에 사용자 친화적이지 않은 열 이름이 있으며 이는 생성 된 엔터티의 필드에 반영된다는 것입니다.
친숙한 이름 값을 포함하는 xml 특성을 xml 요소 자체에 추가 할 수 있도록 클래스 필드에 적용 할 수있는 C # 특성이 있습니까? 예를 들어 XmlAttribute와 유사한 것을 사용합니다.
public class Book
{
public string Title { get; set; }
[XmlAttribute("friendlyName","International Standard Book Number")]
public string ISBN { get; set; }
}
직렬화되면 다음과 같은 결과가 나타납니다.
<Book>
<Title>To Kill a Mockingbird</Title>
<ISBN friendlyName="International Standard Book Number">9780061120084</ISBN>
</Book>
그렇게 할 속성이 없습니다. 요소 문서를 xml 데이터와 혼합하는 것은 일반적이지 않습니다. 일반적으로 xsd 문서 또는 다른 방법을 사용하여 xml 스키마를 문서화하려고합니다.
즉, 여기에 방법이 있습니다. ISBN
속성을 문자열에서 friendlyName
직렬화 할 수 있는 속성 이있는 사용자 지정 형식 으로 변경해야합니다 .
public class Book
{
public string Title { get; set; }
public ISBN ISBN { get; set; }
}
public class ISBN
{
[XmlText]
public string value { get; set; }
[XmlAttribute]
public string friendlyName { get; set; }
}
다음은 질문에있는 것과 똑같이 직렬화됩니다.
Book b = new Book
{
Title = "To Kill a Mockingbird",
ISBN = new ISBN
{
value = "9780061120084",
friendlyName = "International Standard Book Number",
}
};
최신 정보
좋아요, 또 다른 접근 방식은 XmlWriter
요소를 만들기 위해 serializer가 만든 호출을 가로 챌 수 있는 사용자 지정 을 만드는 것입니다. 친숙한 이름을 추가하려는 속성에 대한 요소를 만들 때 고유 한 사용자 지정 특성을 작성할 수 있습니다.
public class MyXmlTextWriter : XmlTextWriter
{
public MyXmlTextWriter(TextWriter w)
: base(w)
{
}
public override void WriteStartElement(string prefix, string localName, string ns)
{
base.WriteStartElement(prefix, localName, ns);
switch(localName)
{
case "ISBN":
WriteAttributeString("friendlyName", "International Standard Book Number");
break;
}
}
}
다음은 콘솔 앱에서 사용하는 방법의 예입니다.
XmlSerializer serializer = new XmlSerializer(typeof(Book));
serializer.Serialize(new MyXmlTextWriter(Console.Out), b);
XmlTextWriter
같은 다른 것에 쓸 수 있어야하는 경우 의 다른 생성자를 구현할 수 있습니다 Stream
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다