XML에서 클래스를 생성하는 쉬운 방법이 있습니까? 생성 된 클래스는 XML을 serialize하고 deserialize하는 데 사용됩니다.직렬화를위한 XML 클래스 생성기
많은 속성과 요소가 정의 된 XML이 있습니다. 해당 XML을 기반으로 클래스를 수동으로 만들어야합니까? 또는 XML에서 클래스를
감사를 생성하는 데 사용할 수있는 유틸리티 도구,
에센가 있습니까 방법에 대한 라운드있다
XML에서 클래스를 생성하는 쉬운 방법이 있습니까? 생성 된 클래스는 XML을 serialize하고 deserialize하는 데 사용됩니다.직렬화를위한 XML 클래스 생성기
많은 속성과 요소가 정의 된 XML이 있습니다. 해당 XML을 기반으로 클래스를 수동으로 만들어야합니까? 또는 XML에서 클래스를
감사를 생성하는 데 사용할 수있는 유틸리티 도구,
에센가 있습니까 방법에 대한 라운드있다
@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; }
}
}
}
덕분에,
에센 빌렘의 게시물에 추가
그건 그렇고 문자열 속성을 가진 클래스를 생성합니다. 값의 유효성을 검사하고 적절한 속성 유형을 지정해야합니다. – Esen
나는 많은 (많은) 함정을 감안할 때 개인적으로이 문제에 대한 자신 만의 해결책을 분명하게 지킬 수 있어야한다. 그것은 당신을 위해 작동하는 경우 : 위대한 :) –
: , 당신은 먼저 XML 파일에서 스키마 (XSD)를 생성 할 수 있습니다 xsd.exe
을 사용하여이 이것은 xsd.exe
에 대한 입력으로 사용되어 스키마에서 클래스를 생성 할 수 있습니다. 즉 (명령 프롬프트)
xsd.exe myXmlFile.xml
출력 myXmlFile.xsd
하고 다음에
xsd.exe myXmlFile.xsd
은 XSD 파일로부터 클래스를 생성한다.
이것은 내가 찾고있는 바로 결과를 제공하지 않는다. 그러나이 힌트는 도움이됩니다. 나는 거기에서 내가 찾고있는 클래스를 생성 할 수있는 데이터 세트를 생성 할 수있다. 도움 주셔서 감사합니다. – Esen
:
이것은 XSD를 생성합니다 (하지 세트)
xsd.exe myCustom.xml
이는 C# 클래스를 생성 :
xsd.exe myCustom.xsd /c
생성 된 C# 클래스 무엇입니까? 데이터 세트가 아닌가요? 나는 당신에게 code4life를주지 않았다. – Esen
어떤 언어로 제공됩니까? –
수업을 구성하는 데 사용하는 언어/플랫폼은 무엇입니까? – pmartin
명확하지 않은 점에 대해 사과드립니다. 나는 Microsoft.NET (VB.NET 또는 C# .NET)을 찾고있다. – Esen