[C#] XML 문자열을 객체로 변환

소켓을 통해 XML 문자열을 받고 있는데 이것을 C # 객체로 변환하고 싶습니다.

메시지는 다음과 같은 형식입니다.

<msg>
   <id>1</id>
   <action>stop</action>
</msg>

.Net을 처음 사용하고 있으며이를 수행하는 가장 좋은 방법은 확실하지 않습니다. 이전에 Java 용 JAXB를 사용해 왔으며 비슷한 것이 있는지 또는 다른 방식으로 처리되는지 확실하지 않았습니다.



답변

xsd.exeWindows 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.exeC # 클래스 로 다시 변환 할 수 있습니다 .

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


답변

두 가지 가능성이 있습니다.

방법 1. XSD 도구


이 위치에 XML 파일이 있다고 가정하십시오. C:\path\to\xml\file.xml

  1. 열기 개발자는 명령 프롬프트
    당신은에서 찾을 수 있습니다 Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
    당신은 그냥 입력을 시작할 수있는 Windows 8이있는 경우 또는 개발자 명령 프롬프트 에서 시작 화면
  2. 다음을 입력하여 XML 파일 디렉토리로 위치를 변경하십시오. cd /D "C:\path\to\xml"
  3. 다음 을 입력하여 XML 파일 에서 XSD 파일 을 작성하십시오.xsd file.xml
  4. 입력하여 C # 클래스 만들기xsd /c file.xsd

그리고 그게 다야! xml 파일에서 C # 클래스를 생성했습니다.C:\path\to\xml\file.cs

방법 2-특수 붙여 넣기


프로젝트 대상으로 .Net Framework> = 4.5 및 ‘Windows Communication Foundation’개별 구성 요소가 설치된 Visual Studio 2012+ 필요

  1. XML 파일의 내용을 클립 보드로 복사
  2. 새로운 빈 클래스 파일 ( Shift+ Alt+ C)을 솔루션에 추가
  3. 해당 파일을 열고 메뉴에서 클릭 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);

이 시리얼 라이저 지원 :

  • 표준 XMLSerializer의 역 직렬화 XML
  • 직렬화 클래스, 구조체, 제네릭 클래스, 프리미티브 유형, 제네릭 목록 및 사전, 배열, 열거 형
  • 속성 인터페이스가있는 직렬화 클래스
  • 직렬화 순환 참조 및 참조 ID
  • 이전 버전의 XML 역 직렬화
  • 부동산 암호화
  • 맞춤형 시리얼 라이저
  • XmlElementAttribute 및 XmlRootAttribute 지원
  • POCO-모든 구성 (마이그레이션, 사용자 정의 시리얼 라이저 …)이 클래스 외부에 있습니다.

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