소켓을 통해 XML 문자열을 받고 있는데 이것을 C # 객체로 변환하고 싶습니다.
메시지는 다음과 같은 형식입니다.
<msg>
<id>1</id>
<action>stop</action>
</msg>
.Net을 처음 사용하고 있으며이를 수행하는 가장 좋은 방법은 확실하지 않습니다. 이전에 Java 용 JAXB를 사용해 왔으며 비슷한 것이 있는지 또는 다른 방식으로 처리되는지 확실하지 않았습니다.
소켓을 통해 XML 문자열을 받고 있는데 이것을 C # 객체로 변환하고 싶습니다.
메시지는 다음과 같은 형식입니다.
<msg>
<id>1</id>
<action>stop</action>
</msg>
.Net을 처음 사용하고 있으며이를 수행하는 가장 좋은 방법은 확실하지 않습니다. 이전에 Java 용 JAXB를 사용해 왔으며 비슷한 것이 있는지 또는 다른 방식으로 처리되는지 확실하지 않았습니다.
답변:
xsd.exe
Windows SDK와 함께 설치 되는 도구를 다음과 같은 디렉토리 에 사용해야합니다 .
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
그리고 64 비트 컴퓨터에서 :
C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin
그리고 Windows 10 컴퓨터에서 :
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
첫 번째 실행에서 xsd.exe
샘플 XML을 사용하고 XSD 파일 (XML 스키마 파일)로 변환합니다.
xsd yourfile.xml
이렇게하면 yourfile.xsd
두 번째 단계에서 xsd.exe
C # 클래스 로 다시 변환 할 수 있습니다 .
xsd yourfile.xsd /c
이것은 yourfile.cs
당신이 얻는 XML 파일을 직렬화 해제하는 데 사용할 수있는 C # 클래스를 포함 하는 파일 을 제공해야합니다 :
XmlSerializer serializer = new XmlSerializer(typeof(msg));
msg resultingMessage = (msg)serializer.Deserialize(new XmlTextReader("yourfile.xml"));
대부분의 경우 꽤 잘 작동합니다.
업데이트 : XML 시리얼 라이저는 모든 스트림을 입력으로 사용합니다. 파일이나 메모리 스트림은 괜찮습니다.
XmlSerializer serializer = new XmlSerializer(typeof(msg));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString));
msg resultingMessage = (msg)serializer.Deserialize(memStream);
또는 StringReader를 사용하십시오.
XmlSerializer serializer = new XmlSerializer(typeof(msg));
StringReader rdr = new StringReader(inputString);
msg resultingMessage = (msg)serializer.Deserialize(rdr);
두 가지 가능성이 있습니다.
C:\path\to\xml\file.xml
Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
당신은 그냥 입력을 시작할 수있는 Windows 8이있는 경우 또는 개발자 명령 프롬프트 에서 시작 화면cd /D "C:\path\to\xml"
xsd file.xml
xsd /c file.xsd
그리고 그게 다야! xml 파일에서 C # 클래스를 생성했습니다.C:\path\to\xml\file.cs
Edit > Paste special > Paste XML As Classes
그리고 그게 다야!
이 도우미 클래스는 사용법이 매우 간단합니다.
using System;
using System.IO;
using System.Web.Script.Serialization; // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;
namespace Helpers
{
internal static class ParseHelpers
{
private static JavaScriptSerializer json;
private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } }
public static Stream ToStream(this string @this)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(@this);
writer.Flush();
stream.Position = 0;
return stream;
}
public static T ParseXML<T>(this string @this) where T : class
{
var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
}
public static T ParseJSON<T>(this string @this) where T : class
{
return JSON.Deserialize<T>(@this.Trim());
}
}
}
지금해야 할 일은 :
public class JSONRoot
{
public catalog catalog { get; set; }
}
// ...
string xml = File.ReadAllText(@"D:\file.xml");
var catalog1 = xml.ParseXML<catalog>();
string json = File.ReadAllText(@"D:\file.json");
var catalog2 = json.ParseJSON<JSONRoot>();
이 방법을 사용하여 Xml을 개체로 변환하십시오. 정확히 당신이하고있는 일을 위해 만들어졌습니다.
protected T FromXml<T>(String xml)
{
T returnedXmlClass = default(T);
try
{
using (TextReader reader = new StringReader(xml))
{
try
{
returnedXmlClass =
(T)new XmlSerializer(typeof(T)).Deserialize(reader);
}
catch (InvalidOperationException)
{
// String passed is not XML, simply return defaultXmlClass
}
}
}
catch (Exception ex)
{
}
return returnedXmlClass ;
}
이 코드를 사용하여 호출하십시오.
YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);
관리로 Visual Studio 2013을 실행하기 만하면됩니다 ... Xml 파일의 내용을 복사하십시오. Visual Studio 2013> 편집> 선택하여 붙여 넣기> Xml을 C # 클래스로 붙여 넣기로 이동하면 Xml 파일 내용에 따라 c # 클래스가 만들어집니다.
누군가가 이것이 유용하다고 생각하는 경우를 대비하여 :
public static class XmlConvert
{
public static string SerializeObject<T>(T dataObject)
{
if (dataObject == null)
{
return string.Empty;
}
try
{
using (StringWriter stringWriter = new System.IO.StringWriter())
{
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stringWriter, dataObject);
return stringWriter.ToString();
}
}
catch (Exception ex)
{
return string.Empty;
}
}
public static T DeserializeObject<T>(string xml)
where T : new()
{
if (string.IsNullOrEmpty(xml))
{
return new T();
}
try
{
using (var stringReader = new StringReader(xml))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
}
catch (Exception ex)
{
return new T();
}
}
}
다음을 사용하여 호출 할 수 있습니다.
MyCustomObject myObject = new MyCustomObject();
string xmlString = XmlConvert.SerializeObject(myObject)
myObject = XmlConvert.DeserializeObject<MyCustomObject>(xmlString);
위에서 설명한대로 클래스를 생성하거나 수동으로 작성할 수 있습니다.
[XmlRoot("msg")]
public class Message
{
[XmlElement("id")]
public string Id { get; set; }
[XmlElement("action")]
public string Action { get; set; }
}
그런 다음 ExtendedXmlSerializer 를 사용 하여 직렬화 및 역 직렬화를 수행 할 수 있습니다 .
설치 nuget 에서 ExtendedXmlSerializer를 설치 하거나 다음 명령을 실행할 수 있습니다 .
Install-Package ExtendedXmlSerializer
직렬화 :
var serializer = new ConfigurationContainer().Create();
var obj = new Message();
var xml = serializer.Serialize(obj);
역 직렬화
var obj2 = serializer.Deserialize<Message>(xml);
이 시리얼 라이저 지원 :
ExtendedXmlSerializer는 .NET 4.5 이상 및 .NET Core를 지원 합니다. WebApi 및 AspCore와 통합 할 수 있습니다.
xsd.exe를 사용하여 .Net에서 스키마 바운드 클래스를 만든 다음 XmlSerializer를 사용하여 문자열을 역 직렬화 할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx
CustomObject로 DTO 생성
JAXB를 사용하여 XML 문자열을 DTO로 변환하려면 아래 방법을 사용하십시오.
private static CustomObject getCustomObject(final String ruleStr) {
CustomObject customObject = null;
try {
JAXBContext jaxbContext = JAXBContext.newInstance(CustomObject.class);
final StringReader reader = new StringReader(ruleStr);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
customObject = (CustomObject) jaxbUnmarshaller.unmarshal(reader);
} catch (JAXBException e) {
LOGGER.info("getCustomObject parse error: ", e);
}
return customObject;
}
다른 답변 외에도 여기 에서 XML DOM과 같은 읽기를 위해 XmlDocument 클래스를 사용 하거나 빨리 감기 전용 리더 인 XmlReader를 "수동으로"사용할 수 있습니다.
고급 xsd-c # 클래스 생성 도구를 사용하는 다른 방법 : xsd2code.com. 이 도구는 매우 편리하고 강력합니다. Visual Studio의 xsd.exe 도구보다 훨씬 많은 사용자 지정 기능이 있습니다. Xsd2Code ++는 목록 또는 배열을 사용하도록 사용자 정의 할 수 있으며 많은 Import 문으로 큰 스키마를 지원합니다.
일부 기능에 대한 참고 사항
나는이 질문이 오래되었다는 것을 알고 있지만 그것에 빠져 들었고 다른 사람들과는 다른 대답을 가지고 있습니다 :-)
일반적인 방법 (위의 주석가들처럼)은 클래스를 생성하고 XML을 직렬화 해제하는 것입니다.
그러나 ( 경고 : 부끄러운 자기 진흥 여기 ) 나는 너가 필요로하지 않는 너겟 패키지를 여기에 출판 했다. 당신은 간다 :
string xml = System.IO.File.ReadAllText(@"C:\test\books.xml");
var book = Dandraka.XmlUtilities.XmlSlurper.ParseText(xml);
그것은 문자 그대로, 다른 것은 필요하지 않습니다. 그리고 가장 중요한 것은 XML이 변경되면 객체도 자동으로 변경됩니다.
dll을 직접 다운로드하려면 github 페이지가 여기에 있습니다 .
public string Serialize<T>(T settings)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringWriter outStream = new StringWriter();
serializer.Serialize(outStream, settings);
return outStream.ToString();
}