2008-09-17 8 views
28

개체에로드하고 해당 개체를 조작 (값 설정, 값 읽기)하려는 XML이 있고 그 XML을 다시 저장합니다. 내가 만든 구조 (xsd)에 XML을 포함하는 것이 중요합니다.XML을 C# 개체에 매핑하는 방법

내가 할 수있는 한 가지 방법은 내 자신의 시리얼 라이저를 작성하는 것입니다.

답변

28

당신은 xsd.exe 사용하여 스키마 (XSD)에서 직렬화의 C# 클래스를 생성 할 수 있습니다 : 스키마 종속성 (포함/수입 스키마)가있는 경우

xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir 

을, 그들은 모두 같은 명령 줄에 포함되어야합니다 .

+11

[+1] XSD를 사용할 때/c를 사용하여 클래스를 생성하거나/d를 사용하여 DataSet 파생 클래스를 생성해야합니다. 그렇지 않으면 "오류 : 클래스 또는 데이터 집합 중 하나만 생성 할 수 있습니다."라는 오류 메시지가 표시됩니다. – Marc

0

NetDataContractSerializer가 원하는대로 처리 할 수 ​​있습니다.

7

LINQ to XML은 .net 3.5를 사용하는 경우 매우 강력합니다. LINQ to XSD도 유용 할 수 있습니다!

+2

이되는 XSD에 LINQ의 공식 페이지 : http://linqtoxsd.codeplex.com/ –

+0

질문에 명시된대로 정말 C#을 매핑을합니까? – Konstantin

+0

nah, Linq To XML은 영속 클래스에 매핑하는 데 사용할 수 없습니다. –

2

Visual Studio와 함께 제공되는 xsd.exe 명령 줄 프로그램을 사용하여 프로젝트/솔루션에서 사용할 수있는 클래스 파일을 만들고 System.Xml.Serialization 네임 스페이스 (특히 XmlSerializer 클래스)를 사용하여 해당 파일을 serialize/deserialize합니다 디스크와 클래스를 연결합니다.

2

using System.Xml.Serialization; 이 네임 스페이스에는 XML을 임의의 개체에 매핑하려는 경우 필요한 모든 특성이 있습니다. 또는 xsd.exe 도구를 사용할 수 있습니다.

xsd file.xsd {/ classes |[/ 언어 : 언어] [/ namespace : 네임 스페이스] [/ outputdir : 디렉토리] xsd 파일을 가져 와서 C# 또는 vb.net 클래스를 생성합니다. 그들의.

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

18

이 코드는 (이후 C# DOTNET 1.0) XML에 대부분의 개체를 직렬화하는 것은 매우 잘 작동합니다. (다시) 이 가능한 스틱의 경우 마이크로 소프트가 많은 버그를 가지고에서만 배열을

using System;  
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 


public static string Serialize(object objectToSerialize) 
{ 
    MemoryStream mem = new MemoryStream();   
    XmlSerializer ser = new XmlSerializer(objectToSerialize.GetType());   
    ser.Serialize(mem, objectToSerialize);      
    ASCIIEncoding ascii = new ASCIIEncoding(); 
    return ascii.GetString(mem.ToArray()); 
}   

public static object Deserialize(Type typeToDeserialize, string xmlString) 
{ 
    byte[] bytes = Encoding.UTF8.GetBytes(xmlString); 
    MemoryStream mem = new MemoryStream(bytes);   
    XmlSerializer ser = new XmlSerializer(typeToDeserialize); 
    return ser.Deserialize(mem); 
} 
+1

편리한 루틴이지만 매개 변수없는 생성자가없는 개체에서는 작동하지 않습니다. – ChadD

+0

우리는 TypeToDeserialize 클래스와 그 멤버에 매핑 태그를 작성해야합니까 ??? –

+0

이것은 JSON.NET JSON과 XML을 데이터베이스로 변환하는 데 도움이되었습니다. JSON.NET은 XML 자체를 사용하여 다시 JSON으로 다시 매핑 할 수있는 XML을 만들지 않았습니다. 즉, 생성 된 XML을 ASP.NET XML 메서드로 사용하는 방법을 찾지 못했습니다. –

1

xsd.exe를 사용하여 객체 ArrayLists를 포함하는 작동하고 있지 않습니다 | 오픈 소스 펄을 사용해보십시오 http://xsd2code.codeplex.com/

+0

+1 감사합니다. 사실 실제로 활성화되어 있고 몇 가지 문서가 있습니다. – knownasilya

1

XML에서 C# 클래스를 자동으로 생성 할 수있는 프레임 워크를 만들었습니다. XML을 전달하는 시각적 항목 템플릿이며 클래스는 프로젝트에서 자동으로 생성됩니다. 이 클래스를 사용하여 XML을 작성/읽기/쓰기 할 수 있습니다.

확인 프레임 워크 및 Visual C# 항목 템플릿에 대한 링크 : click here

1

나는 XSD 정말 쓰레기 동의 ...하지만 그들은 거의 누구나가 알고있는 다른 버전을했다. 그것의 호출 된 xsd 개체 생성기. 그것의 다음 버전과 길을 더 많은 옵션이 있습니다. 그것은 XSD에서 파일을 생성하고 환상적으로 작동합니다. XML 스파이와 같은 스키마 생성기가있는 경우 xml에서 xsd를 만들고이 도구를 사용하십시오. 이 도구를 사용하여 매우 복잡한 클래스를 만들었습니다. 그런 다음 추가 속성 \ 메소드 등을위한 부분 클래스를 만듭니다. 그러면 스키마를 업데이트 할 때 클래스를 재생성하고 부분 클래스에서 모든 편집 내용을 유지합니다.지금

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7075