2012-04-26 3 views
2

XML에서 클래스를 생성하는 쉬운 방법이 있습니까? 생성 된 클래스는 XML을 serialize하고 deserialize하는 데 사용됩니다.직렬화를위한 XML 클래스 생성기

많은 속성과 요소가 정의 된 XML이 있습니다. 해당 XML을 기반으로 클래스를 수동으로 만들어야합니까? 또는 XML에서 클래스를

감사를 생성하는 데 사용할 수있는 유틸리티 도구,

에센가 있습니까 방법에 대한 라운드있다

+0

어떤 언어로 제공됩니까? –

+0

수업을 구성하는 데 사용하는 언어/플랫폼은 무엇입니까? – pmartin

+0

명확하지 않은 점에 대해 사과드립니다. 나는 Microsoft.NET (VB.NET 또는 C# .NET)을 찾고있다. – Esen

답변

1

@Willem van Rumpt : 솔루션으로 나를 생성하는 데 도움이되었습니다. 그러나 어떤 경우에 데이터 집합을 인스턴스화하려고하면 "이 테이블은 두 개의 중첩 된 관계에있는 자식 테이블이 될 수 없습니다 ..."라는 예외가 발생합니다.

xmldocument 개체를 사용하여 각 노드를 탐색하는 다른 방법을 시도했습니다. XML 파일을 serialize하고 deserialize하는 데 사용할 수있는 내 클래스를 생성합니다. 유사한 솔루션을 찾고있는 사람에게 도움이 될 수 있도록 여기에 게시하는 것이 좋습니다. 최적화 된 솔루션이 있으면 게시하십시오.

namespace Utility1 
{ 
public static class XMLHelper 
{ 
    private enum XMLType 
    { 
     Element, 
     Attribute 
    } 
    public static string GenerateXMLClass(string xmlstring) 
    { 
     XmlDocument xd = new XmlDocument(); 
     xd.LoadXml(xmlstring); 
     XmlNode rootNode = xd.DocumentElement; 
     var xmlClassCollection = new Dictionary<string, XMLClass>(); 
     var xmlClass = new XMLClass(); 
     xmlClassCollection.Add(rootNode.Name, xmlClass); 
     CollectAttributes(ref xmlClass, rootNode); 
     CollectElements(ref xmlClass, rootNode); 
     CollectChildClass(ref xmlClassCollection, rootNode); 

     var clsBuilder = new StringBuilder(); 

     clsBuilder.AppendLine("[XmlRoot(\"" + rootNode.Name + "\")]"); 

     foreach (var cls in xmlClassCollection) 
     { 
      clsBuilder.AppendLine("public class " + cls.Key); 
      clsBuilder.AppendLine("{"); 

      foreach (var element in cls.Value.Elements) 
      { 
       if (XMLType.Element == element.XmlType) 
        clsBuilder.AppendLine("[XmlElement(\"" + element.Name + "\")]"); 
       else 
        clsBuilder.AppendLine("[XmlAttribute(\"" + element.Name + "\")]"); 
       clsBuilder.AppendLine("public " + element.Type + element.Name + "{get;set;}"); 
      } 

      clsBuilder.AppendLine("}"); 
     } 

     return clsBuilder.ToString(); 
    } 

    private static void CollectAttributes(ref XMLClass xmlClass, XmlNode node) 
    { 
     if (null != node.Attributes) 
     { 
      foreach (XmlAttribute attr in node.Attributes) 
      { 
       if (null == xmlClass.Elements.SingleOrDefault(o => o.Name == attr.Name)) 
        xmlClass.Elements.Add(new Element("string ", attr.Name, XMLType.Attribute)); 
      } 
     } 
    } 

    private static bool IsEndElement(XmlNode node) 
    { 
     if ((null == node.Attributes || node.Attributes.Count <= 0) && 
        (null == node.ChildNodes || !node.HasChildNodes || (node.ChildNodes.Count == 1 && node.ChildNodes[0].NodeType == XmlNodeType.Text))) 
     { 
      return true; 
     } 
     return false; 
    } 

    private static void CollectElements(ref XMLClass xmlClass, XmlNode node) 
    { 
     foreach (XmlNode childNode in node.ChildNodes) 
     { 
      if (null == xmlClass.Elements.SingleOrDefault(o => o.Name == childNode.Name)) 
      { 
       var occurance = node.ChildNodes.Cast<XmlNode>().Where(o => o.Name == childNode.Name).Count(); 
       var appender = " "; 
       if (occurance > 1) 
        appender = "[] "; 

       if(IsEndElement(childNode)) 
       { 
        xmlClass.Elements.Add(new Element("string" + appender, childNode.Name, XMLType.Element)); 
       } 
       else 
       { 
        xmlClass.Elements.Add(new Element(childNode.Name + appender, childNode.Name, XMLType.Element)); 
       } 
      } 
     } 
    } 

    private static void CollectChildClass(ref Dictionary<string, XMLClass> xmlClsCollection, XmlNode node) 
    { 
     foreach (XmlNode childNode in node.ChildNodes) 
     { 
      if (!IsEndElement(childNode)) 
      { 
       XMLClass xmlClass; 
       if (xmlClsCollection.ContainsKey(childNode.Name)) 
        xmlClass = xmlClsCollection[childNode.Name]; 
       else 
       { 
        xmlClass = new XMLClass(); 
        xmlClsCollection.Add(childNode.Name, xmlClass); 
       } 
       CollectAttributes(ref xmlClass, childNode); 
       CollectElements(ref xmlClass, childNode); 
       CollectChildClass(ref xmlClsCollection, childNode); 
      } 
     } 
    } 

    private class XMLClass 
    { 
     public XMLClass() 
     { 
      Elements = new List<Element>(); 
     } 
     public List<Element> Elements { get; set; } 
    } 

    private class Element 
    { 
     public Element(string type, string name, XMLType xmltype) 
     { 
      Type = type; 
      Name = name; 
      XmlType = xmltype; 
     } 
     public XMLType XmlType { get; set; } 
     public string Name { get; set; } 
     public string Type { get; set; } 
    } 
    } 
} 

덕분에,

에센 빌렘의 게시물에 추가

+0

그건 그렇고 문자열 속성을 가진 클래스를 생성합니다. 값의 유효성을 검사하고 적절한 속성 유형을 지정해야합니다. – Esen

+0

나는 많은 (많은) 함정을 감안할 때 개인적으로이 문제에 대한 자신 만의 해결책을 분명하게 지킬 수 있어야한다. 그것은 당신을 위해 작동하는 경우 : 위대한 :) –

2

: , 당신은 먼저 XML 파일에서 스키마 (XSD)를 생성 할 수 있습니다 xsd.exe을 사용하여이 이것은 xsd.exe에 대한 입력으로 사용되어 스키마에서 클래스를 생성 할 수 있습니다. 즉 (명령 프롬프트)

xsd.exe myXmlFile.xml 

출력 myXmlFile.xsd

하고 다음에

xsd.exe myXmlFile.xsd 

은 XSD 파일로부터 클래스를 생성한다.

+0

이것은 내가 찾고있는 바로 결과를 제공하지 않는다. 그러나이 힌트는 도움이됩니다. 나는 거기에서 내가 찾고있는 클래스를 생성 할 수있는 데이터 세트를 생성 할 수있다. 도움 주셔서 감사합니다. – Esen

3

:

이것은 XSD를 생성합니다 (하지 세트)

xsd.exe myCustom.xml 

이는 C# 클래스를 생성 :

xsd.exe myCustom.xsd /c 
+0

생성 된 C# 클래스 무엇입니까? 데이터 세트가 아닌가요? 나는 당신에게 code4life를주지 않았다. – Esen