XML 속성을 통해 클래스 이름을 어떻게 바꿀 수 있습니까?
Song 이라는 XML 직렬화 가능 클래스가 있다고 가정합니다 .
[Serializable]
class Song
{
public string Artist;
public string SongTitle;
}
공간을 절약 하고 XML 파일을 부분적으로 난독 화 하기 위해 xml 요소의 이름을 변경하기로 결정했습니다.
[XmlRoot("g")]
class Song
{
[XmlElement("a")]
public string Artist;
[XmlElement("s")]
public string SongTitle;
}
그러면 다음과 같은 XML 출력이 생성됩니다.
<Song>
<a>Britney Spears</a>
<s>I Did It Again</s>
</Song>
클래스 / 개체의 이름도 바꾸거나 다시 매핑하고 싶습니다. 위의 예에서 Song 클래스의 이름 을 g 로 바꾸고 싶습니다 . 따라서 결과 xml은 다음과 같아야합니다.
<g>
<a>Britney Spears</a>
<s>I Did It Again</s>
</g>
xml-attributes를 통해 클래스 이름의 이름을 바꿀 수 있습니까?
DOM을 수동으로 생성 / 탐색하고 싶지 않기 때문에 데코레이터를 통해 얻을 수 있는지 궁금합니다.
미리 감사드립니다!
업데이트 : 죄송합니다! 이번엔 정말 또 해봤어요! 언급하는 것을 잊었습니다. 저는 실제로 XML에서 Song 객체 목록을 직렬화하고 있습니다.
직렬화 코드는 다음과 같습니다.
public static bool SaveSongs(List<Song> songs)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
using (TextWriter textWriter = new StreamWriter("filename"))
{
serializer.Serialize(textWriter, songs);
}
}
다음은 XML 출력입니다.
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSong>
<Song>
<a>Britney Spears</a>
<s>Oops! I Did It Again</s>
</Song>
<Song>
<a>Rihanna</a>
<s>A Girl Like Me</s>
</Song>
</ArrayOfSong>
분명히 XmlRoot () 특성은 목록 컨텍스트에서 개체의 이름을 바꾸지 않습니다.
내가 뭔가 빠졌나요?
XmlRoot 속성을 확인하십시오.
문서는 여기에서 찾을 수 있습니다 : http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute(v=VS.90).aspx
[XmlRoot(Namespace = "www.contoso.com",
ElementName = "MyGroupName",
DataType = "string",
IsNullable=true)]
public class Group
업데이트 : 방금 시도했고 VS 2008에서 완벽하게 작동합니다.이 코드 :
[XmlRoot(ElementName = "sgr")]
public class SongGroup
{
public SongGroup()
{
this.Songs = new List<Song>();
}
[XmlElement(ElementName = "sgs")]
public List<Song> Songs { get; set; }
}
[XmlRoot(ElementName = "g")]
public class Song
{
[XmlElement("a")]
public string Artist { get; set; }
[XmlElement("s")]
public string SongTitle { get; set; }
}
출력 :
<?xml version="1.0" encoding="utf-8"?>
<sgr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www
.w3.org/2001/XMLSchema">
<sgs>
<a>A1</a>
<s>S1</s>
</sgs>
<sgs>
<a>A2</a>
<s>S2</s>
</sgs>
</sgr>
해결 방법 : [XmlType (TypeName = "g")] 사용
XmlRoot 는 문서에 따라 XML 루트 노드 에서만 작동 합니다 (그리고 이름에 root가 포함 된 경우 예상 할 수 있음 )!
나는 다른 답을 얻을 수 없었기 때문에 계속 파고 들었다 ...
대신 XmlTypeAttribute (즉 [XmlType]
)와 해당 TypeName 속성이 루트 가 아닌 클래스 / 객체에 대해 유사한 작업을 수행 한다는 사실을 발견했습니다 .
예 :
[XmlType(TypeName="g")]
class Song
{
public string Artist;
public string SongTitle;
}
예를 들어 다른 클래스에 적용한다고 가정합니다.
[XmlType(TypeName="a")]
class Artist
{
.....
}
[XmlType(TypeName="s")]
class SongTitle
{
.....
}
그러면 질문에 필요한대로 정확히 다음이 출력됩니다 .
<g>
<a>Britney Spears</a>
<s>I Did It Again</s>
</g>
나는 이것을 여러 생산 프로젝트에서 사용했으며 아무런 문제가 없다는 것을 발견했습니다.
이것이 문서의 루트 요소라면 [XmlRoot ( "g")]를 사용할 수 있습니다 .
Here is my updated response based on your clarification. The degree of control you are asking for is not possible without a wrapping class. This example uses a SongGroup
class to wrap the list so that you can give alternate names to the items within.
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
public class SongGroup
{
public SongGroup()
{
this.Songs = new List<Song>();
}
[XmlArrayItem("g", typeof(Song))]
public List<Song> Songs { get; set; }
}
public class Song
{
public Song()
{
}
[XmlElement("a")]
public string Artist { get; set; }
[XmlElement("s")]
public string SongTitle { get; set; }
}
internal class Test
{
private static void Main()
{
XmlSerializer serializer = new XmlSerializer(typeof(SongGroup));
SongGroup group = new SongGroup();
group.Songs.Add(new Song() { Artist = "A1", SongTitle = "S1" });
group.Songs.Add(new Song() { Artist = "A2", SongTitle = "S2" });
using (Stream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream))
{
serializer.Serialize(writer, group);
stream.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
}
}
}
This has the side effect of generating one more inner element representing the list itself. On my system, the output looks like this:
<?xml version="1.0" encoding="utf-8"?>
<SongGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Songs>
<g>
<a>A1</a>
<s>S1</s>
</g>
<g>
<a>A2</a>
<s>S2</s>
</g>
</Songs>
</SongGroup>
[XmlRoot("g")]
class Song
{
}
Should do the trick
Use XmlElementAttribute: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.aspx
[Serializable]
[XmlRoot(ElementName="g")]
class Song
{
public string Artist;
public string SongTitle;
}
should work.
참고URL : https://stackoverflow.com/questions/3653411/how-can-i-rename-class-names-via-xml-attributes
'programing tip' 카테고리의 다른 글
Eclipse 프로그램에서 Java 키워드 어설 션을 활성화하는 방법은 무엇입니까? (0) | 2020.12.03 |
---|---|
XML 헤더가 포함 된 경우 C # XmlDocument.LoadXml (string)이 실패하는 이유는 무엇입니까? (0) | 2020.12.03 |
Express js를 출력 파일에 로그인 하시겠습니까? (0) | 2020.12.03 |
nullable 형식으로 작동하지 않는 null 조건부 연산자? (0) | 2020.12.02 |
.Net Core 및 NuGet (0) | 2020.12.02 |