3

데이터베이스의 일부분을 저장하려고 시도하는 매우 길고 다양한 XML 파일이 있습니다. 이제는 deserialize 된 데이터를 저장하기 위해 10,000 개의 다른 객체를 직접 쓰고 싶지 않습니다. XML 파일에있는 것을 기반으로 객체를 정의 할 수있는 방법이 있습니까? 내가 가진 경우 예를 들어정의되지 않은 객체로의 일반 XML 비 직렬화

:

<objecttype1> 
    <attr1>Some string of text</attr1> 
</objecttype1> 
<objecttype1> 
    <attr2>123456789</attr2> 
</objecttype1> 

나는 다음과 같은 객체를 원하는 것이 정의 할 수 있습니다 :

public class objecttype1 { 
    public string attr1 {get; set;} 
    public string attr2 {get; set;} 
} 

는 기본적으로, 나는에 전체 XML 문서를 직렬화하는 원본 XML 문서를 나타내는 일종의 계층 적 구조로 여러 가지 다양한 개체를 만든 다음 해당 개체의 데이터를 추출하여 형식에 따라 데이터베이스에 저장합니다. 어떤 방법이 있습니까/더 나은 방법이 있나요?

+1

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

7

당신은 ExpandoObject을 찾고 있습니다.
ExpandoObject는 C# 4에 도입 된 동적 개체입니다.
샘플 구현 here을 발견

public static IEnumerable<dynamic> GetExpandoFromXml(string file, string descendantid) 
{ 
    var expandoFromXml = new List<dynamic>(); 

    var doc = XDocument.Load(file); 
    var nodes = doc.Root.Descendants(descendantid); 

    foreach (var element in doc.Root.Descendants(descendantid)) 
    { 
     dynamic expandoObject = new ExpandoObject(); 
     var dictionary = expandoObject as IDictionary<string, object>; 
     foreach (var child in element.Descendants()) 
     { 
      if (child.Name.Namespace == "") 
       dictionary[child.Name.ToString()] = child.Value.Trim(); 
     } 
     yield return expandoObject; 
    } 
} 

더 많은 링크 : 한마디로
http://www.codeproject.com/Tips/227139/Converting-XML-to-an-dynamic-object-using-ExpandoO
http://www.codeproject.com/Articles/461677/Creating-a-dynamic-object-from-XML-using-ExpandoOb

+1

동의 (+1),하지만 데이터베이스에 저장하는 경우 XML을 역 직렬화하지 않습니다. 대신 XML 문서 개체 모델 (XmlDocument?)을 사용하여 읽고 데이터베이스에 저장합니다. 그렇지 않으면 모든 문자열 속성을 갖는 객체를 가져 와서 저장하게됩니다. 객체로 역 직렬화하기위한 여분의 단계로 보입니다. – Tengiz

1

를, XML 내용에 의해 명명 된 콘크리트 형으로 XML 에서 유형을 역 직렬화 할 수있는 방법이 없습니다. 주어진 구체적인 유형으로 XML을 비 직렬화 할 수 있으려면 해당 유형을 코드에 정의해야합니다. 또는 다른 유형의 구조를 가질 수도 있습니다.이 구조는 TypeName을 정의 된 위치 (생성 된 곳, 즉 xml의 태그 이름)에서 정의합니다.

동적 객체에 대한 유일한 것은 직렬화가 당신이 제공, 당신은 단지의 모든 특성들을 가지고 동적 유형의 어떤 종류를 가지고 종료됩니다.

데이터베이스에 저장하는 경우 동적 객체로 XML을 deserialize하지 않습니다. 대신 XML 문서 개체 모델 (XmlDocument?)을 사용하여 읽고 데이터베이스에 저장합니다. 그렇지 않으면 모든 문자열 속성을 가진 객체를 가져 와서 저장하게됩니다. 객체로 역 직렬화하기위한 여분의 단계로 보입니다.

게다가 동적 객체로 역 직렬화하면 (답변에서 제안한 것처럼) 다른 유형의 객체를 제공하지는 않습니다 (적어도 XML 유형은 아닙니다).