XMLからクラスを構築する簡単な方法はありますか?構築されたクラスは、XMLのシリアル化と逆シリアル化に使用されます。
たくさんのプロパティと要素が定義されたXMLがあります。そのXMLに基づいてクラスを手動で作成する必要がありますか?または、XMLからクラスを生成するために利用できるユーティリティツールはありますか
ありがとう、
エセン
XMLからクラスを構築する簡単な方法はありますか?構築されたクラスは、XMLのシリアル化と逆シリアル化に使用されます。
たくさんのプロパティと要素が定義されたXMLがあります。そのXMLに基づいてクラスを手動で作成する必要がありますか?または、XMLからクラスを生成するために利用できるユーティリティツールはありますか
ありがとう、
エセン
ウィレムの投稿についてさらに:
これにより、XSD(データセットではない)が生成されます
xsd.exe myCustom.xml
これにより、C#クラスが生成されます。
xsd.exe myCustom.xsd /c
ラウンドアバウトの方法がありxsd.exe
ます。を使用して、最初にxmlファイルからスキーマ(xsd)を作成し、それをxsd.exe
スキーマからクラスを生成するための入力として使用できます。すなわち(コマンドプロンプトから):
xsd.exe myXmlFile.xml
出力するmyXmlFile.xsd
そして次
xsd.exe myXmlFile.xsd
xsdファイルからクラスを生成します。
@Willem van Rumpt:ソリューションはクラスを生成するのに役立ちました。しかし、場合によっては、データセットをインスタンス化しようとすると、「同じテーブルを2つのネストされたリレーションの子テーブルにすることはできません...」という例外が発生することがあります。
xmldocumentオブジェクトを使用して各ノードをナビゲートし、xmlファイルのシリアル化と逆シリアル化に使用できるクラスを生成するさまざまなソリューションを試しました。同様の解決策を探している人に役立つように、ここに投稿することを考えました。最適化されたソリューションがある場合は、投稿してください。
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; }
}
}
}
ありがとう、
エセン