2

XMLからクラスを構築する簡単な方法はありますか?構築されたクラスは、XMLのシリアル化と逆シリアル化に使用されます。

たくさんのプロパティと要素が定義されたXMLがあります。そのXMLに基づいてクラスを手動で作成する必要がありますか?または、XMLからクラスを生成するために利用できるユーティリティツールはありますか

ありがとう、

エセン

4

3 に答える 3

3

ウィレムの投稿についてさらに:

これにより、XSD(データセットではない)が生成されます

xsd.exe myCustom.xml

これにより、C#クラスが生成されます。

xsd.exe myCustom.xsd /c
于 2012-04-27T19:37:56.923 に答える
2

ラウンドアバウトの方法がありxsd.exeます。を使用して、最初にxmlファイルからスキーマ(xsd)を作成し、それをxsd.exeスキーマからクラスを生成するための入力として使用できます。すなわち(コマンドプロンプトから):

xsd.exe myXmlFile.xml

出力するmyXmlFile.xsd

そして次

xsd.exe myXmlFile.xsd

xsdファイルからクラスを生成します。

于 2012-04-26T15:47:04.903 に答える
1

@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; }
    }
  }
}

ありがとう、

エセン

于 2012-04-27T15:05:53.290 に答える