Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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# LINQ到XML到POCO对象_C#_Linq To Xml_Poco - Fatal编程技术网

C# LINQ到XML到POCO对象

C# LINQ到XML到POCO对象,c#,linq-to-xml,poco,C#,Linq To Xml,Poco,我有一个XML文件,我想把它转换成POCO对象列表 我有以下工作代码来读取XML并从中创建对象。我只是想检查一下这是一个很好的方法,我没有错过任何技巧。特别是关于嵌套Linq查询 XDocument xmlDoc = XDocument.Load(path); var q = from file in xmlDoc.Descendants("File") select new ImportDefinition() { Name = file

我有一个XML文件,我想把它转换成POCO对象列表

我有以下工作代码来读取XML并从中创建对象。我只是想检查一下这是一个很好的方法,我没有错过任何技巧。特别是关于嵌套Linq查询

XDocument xmlDoc = XDocument.Load(path);
var q = from file in xmlDoc.Descendants("File")
        select new ImportDefinition()
        {
            Name = file.Attribute("Name").Value,
            TypeName = file.Attribute("TypeName").Value,
            ColumnMappings =  
            (
                from map in file.Descendants("ColumnMap") 
                select new ColumnMap() 
                { 
                    DatabaseColumn = new Column()
                    { 
                        Name = map.Element("DatabaseColumn").Attribute("Name").Value
                    }
                }
            ).ToList<ColumnMap>()               
        };
List<ImportDefinition> def = q.ToList<ImportDefinition>();
XDocument xmlDoc=XDocument.Load(路径);
var q=来自xmlDoc.substands(“文件”)中的文件
选择新的导入定义()
{
Name=file.Attribute(“Name”).Value,
TypeName=file.Attribute(“TypeName”).Value,
列映射=
(
从文件中的映射。子体(“ColumnMap”)
选择new ColumnMap()
{ 
DatabaseColumn=新列()
{ 
Name=map.Element(“DatabaseColumn”).Attribute(“Name”).Value
}
}
)托利斯先生()
};
List def=q.ToList();

感谢您的POCO对象不仅具有字符串属性,XElement和XAttribute还为其他类型提供了广泛的选择,包括在元素/属性不存在的情况下的空值

例如:

XDocument xmlDoc = XDocument.Load(path);
var q = from file in xmlDoc.Descendants("File")
        select new ImportDefinition()
        {
            Name         = (string)file.Attribute("Name"),
            TypeName     = (string)file.Attribute("TypeName"),
            Size         = (int)file.Attribute("Size"),
            LastModified = (DateTime?)file.Attribute("LastModified"),
            // ...
        };

也许可以尝试显式转换

public class ColumnMap
{
    public static explicit operator ColumnMap(XElement xElem)
    {
        return new ColumnMap()
        {
            DatabaseColumn = new Column()
            {
                Name = xElem.Element("DatabaseColumn").Attribute("Name").Value
            }
        };
    }
}

public class ImportDefinition
{
    public static explicit operator ImportDefinition(XElement xElem)
    {
        return new ImportDefinition() 
        { 
            Name           = (string)xElem.Attribute("Name"), 
            TypeName       = (string)xElem.Attribute("TypeName"), 
            Size           = (int)xElem.Attribute("Size"), 
            LastModified   = (DateTime?)xElem.Attribute("LastModified"), 
            ColumnMappings = xElem.Descendants("ColumnMap").Select(xelem => (ColumnMap)xelem).ToList()
        }; 
    }
}
然后像这样使用它:

XDocument xmlDoc = XDocument.Load(path); 
List<ImportDefinition> importDefinitions = xmlDoc.Descendants("File").Select(xElem => (ImportDefinition)xElem).ToList()
XDocument xmlDoc=XDocument.Load(路径);
列出importDefinitions=xmlDoc.subjects(“文件”)。选择(xElem=>(ImportDefinition)xElem.ToList()

Afaik.Cast不调用自定义转换运算符,或者是吗?@dtb:如果不是,那么这就不起作用了。还没有测试过,但会认为它只是一个扩展,可以执行类似IEnumerable Cast(IEnumerable targets){foreach(目标中的t target)yield return(U)target;}我相信这正是Enumerable.Cast所做的,也可能不会很好地工作,因为对泛型参数
U
的转换afaik不寻找自定义转换运算符。但是我也没有测试过。@dtb:咬紧牙关,对它进行了测试,没错,它没有查找自定义转换运算符,尽管select方法工作得很好。Wierd不会想到通用间接寻址会这么做。。