Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保从xml转换时存在值_C#_Xml - Fatal编程技术网

C# 确保从xml转换时存在值

C# 确保从xml转换时存在值,c#,xml,C#,Xml,我有一个将xml文件转换为类对象的实用程序: public static T CreateClassFromXml<T>(string fileName, string root) where T : class { fileName.ThrowNullOrEmpty("fileName"); File.Exists(fileName).ThrowFalse(string.Format("File '{0}' could not be

我有一个将xml文件转换为类对象的实用程序:

    public static T CreateClassFromXml<T>(string fileName, string root) where T : class
    {
        fileName.ThrowNullOrEmpty("fileName");

        File.Exists(fileName).ThrowFalse(string.Format("File '{0}' could not be found", fileName));

        var serializer = new XmlSerializer(typeof(T), new XmlRootAttribute() { ElementName = root });

        using (var reader = XmlReader.Create(fileName))
        {
            return (T)serializer.Deserialize(reader);
        }
    }
public static T CreateClassFromXml(字符串文件名,字符串根),其中T:class
{
fileName.ThrowNullOrEmpty(“fileName”);
files.Exists(fileName.ThrowFalse(string.Format(“找不到文件“{0}”),fileName));
var serializer=new-XmlSerializer(typeof(T),new-XmlRootAttribute(){ElementName=root});
使用(var reader=XmlReader.Create(文件名))
{
返回(T)序列化程序。反序列化(读取器);
}
}

该实用程序读取xml并创建一个类T。使用上面的代码,除了在其周围编写包装器类之外,还有其他方法可以验证所创建的类吗?我需要确保为所有必填字段填充数据。

XmlSerializer中没有内置的工具来完成此操作。你可以自己反省一下。因为XmlSerializer只加载公共属性和字段,所以可以迭代类的所有公共属性和字段,并确保它们都包含数据。您必须决定如何处理值类型(int、DateTime等),因为在加载或未加载时,这并不明显。您还必须递归地深入到引用类型中

如果需要将特定属性\字段标记为必填项,则可以添加自己的属性并用它装饰类成员。在运行时,您将只处理设置了该属性的属性


简而言之,除非您需要针对许多不同场景的通用机制,否则最好针对必须验证的属性手动进行验证。

您可以使用
XSD
验证
XML
。您可以使用属性标记必需的组件(想到System.ComponentModel.DataAnnotations命名空间)。然后,对对象执行验证:将值类型int、double等定义为可空,并在反序列化后检查是否存在任何空值。我不记得序列化属性是否适用于XML。。。我想他们没有,但你可以看看。