【问题标题】:How to pass a class name to a XML Parsing Function in C#?如何将类名传递给 C# 中的 XML 解析函数?
【发布时间】:2017-02-23 21:01:19
【问题描述】:

我不知道为什么我会被困在这里,但在这里需要一些帮助。我有多个具有多个属性的类。我正在尝试使用下面提到的这种方法来解析 XML 文件。

private  void button_Click(object sender, RoutedEventArgs e)
        {

            string XMLFilePath = Path.Combine(Package.Current.InstalledLocation.Path, "UTC34.xml");
            //string data = await FileIO.ReadTextAsync(file);

            if(File.Exists(XMLFilePath))
            {

                FileStream fs = new FileStream(XMLFilePath, FileMode.Open, FileAccess.Read);

                TextReader ff = new StreamReader(fs);
                XDocument xmldoc = XDocument.Parse(ff.ReadToEnd());
                XmlSerializer ser1 = new XmlSerializer(typeof(FlightPlan));
                using (var reader = xmldoc.CreateReader())
                {
                    var serializer = new XmlSerializer(typeof(FlightPlan));
                    FlightPlan someTest = serializer.Deserialize(reader) as FlightPlan;
                    // NotSupportedException here (as inner exception)
                }


            }

我被困在这里

XmlSerializer ser1 = new XmlSerializer(typeof(FlightPlan));//FlightPlan是一个类

我想编写一个方法,其中我传递它们的类名,因为 XML 文件中有多个类。我不想为多个类编写多个函数。

我怎样才能做到这一点?

【问题讨论】:

  • 嗯,这是响应按钮单击而发生的 - 你怎么知道此时要使用哪个类?
  • @JonSkeet jon 我正在做 POC。我有一个大的 XML 文件,我为它生成了 C# 类,一个 XML 文件有多个类,并且数据永远不会改变。我只是在想只能调用一个函数,它将所有 XML 数据序列化到这些类中。我该怎么做?
  • 你的问题很不清楚。如果你提供一个minimal reproducible example 会更好 - 有两个类(每个只有一个属性)和一些代表性的 XML,然后是一个生成 XML 的控制台应用程序以及你试图解析它的内容。
  • @JonSkeet 你能帮帮我吗?

标签: c# visual-studio-2015 xml-parsing


【解决方案1】:

这是我用于 xml 序列化的代码 sn-p。

public static class Serializer<T> where T : class
{
    public static void Serialize(string filename, T obj)
    {
        using (TextWriter WriteFileStream = new StreamWriter(filename, false))
        {
            XmlSerializer SerializerObj = new XmlSerializer(typeof(T));
            SerializerObj.Serialize(WriteFileStream, obj);
        }
    }

    public static T Deserialize(string filename)
    {
        if (File.Exists(filename))
        {
            using (FileStream fs = new FileStream(filename, FileMode.Open))
            {
                XmlSerializer SerializerObj = new XmlSerializer(typeof(T));

                using (XmlReader reader = new XmlTextReader(fs))
                {
                    if (SerializerObj.CanDeserialize(reader))
                    {
                        return SerializerObj.Deserialize(reader) as T;
                    }
                }
            }
        }

        return null;
    }
}

更新

要传入多个类,您应该创建另一个包含其他类的类。

[Serializable]
class Container
{
    public MyClass1 One { get; set; }
    public MyClass2 Two { get; set; }
}

[Serializable]
class MyClass1
{

}

[Serializable]
class MyClass2
{

}

然后调用

static void Main(string[] args)
    {
        Serializer<Container>.Serialize("path", new Container());
    }

【讨论】:

  • 如何传递多个类名?我有一个很大的 XML 文件,我将其转换为 C# 类。转换后的 C# 类文件有 50 个类。我需要将所有这 50 个名称传递到一个函数中,以便我可以序列化。你能帮忙吗?
  • Serializer 根据您要反序列化的根对象的属性自行解决此问题。您只需要像上面的示例一样为其提供根对象类型(将 T 替换为您的类型)
  • @Connell.O'Donnell 非常感谢。让我检查一下然后回复你?
  • @Connell.O'Donnell 如果可能你能来聊天吗?
  • @Connell.O'Donnell 我无法将 [serializable] 属性添加到我的 C# XML 类。我已将 VS 中的 XML 文件特殊粘贴为 C# 类。请帮忙。
【解决方案2】:

我是这样使用的:

string classname = typeof(FlightPlan).Name;

或者

this.GetType().Name

将此作为参数传递或在类型上调用 .Name。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多