假设我有以下XML格式。
<data>
<appName>Microsoft Word</appName>
<appId>123</appId>
</data>
如果XML中有多个数据树,我有以下代码来构建数据对象列表。
List<DataObj> dataObjList =
(
from dataNode in xmlDoc.Elements("data")
select new DataObj
{
appName = dataNode.Element("appName"),
appId = dataNode.Element("appId")
}
).ToList();
但是,如果我在数据标记下添加一个额外的树,我会遇到问题,如下所示:
<data>
<appName>Microsoft Word</appName>
<appId>123</appId>
<appOptions>
<Win7Compat>true</Win7Compat>
<Win7x64Compat>false</Win7x64Compat>
</appOptions>
</data>
我使用以下代码:
List<DataObj> dataObjList =
(
from dataNode in xmlDoc.Elements("data")
select new DataObj
{
appName = dataNode.Element("appName"),
appId = dataNode.Element("appId")
appOptions =
(
from appNode in dataNode.Elements("appOptions")
select new AppOptionsObj
{
win7Compat = appNode.Element("Win7Compat"),
win7x64Compat = appNode.Element("Win7x64Compat")
}
) as AppOptionsObj,
}
).ToList();
我的appOptions对象始终被视为null。我有一种感觉,我没有正确解析子树。
答案 0 :(得分:2)
问题在于您使用as AppOptionsObj
进行投射,但您的Select
实际上正在返回IEnumerable<AppOptionsObj>
,因此投射会产生null
。您可能希望使用SingleOrDefault()
来返回单个实例:
List<DataObj> dataObjList =
(
from dataNode in xmlDoc.Elements("data")
select new DataObj
{
appName = dataNode.Element("appName"),
appId = dataNode.Element("appId")
appOptions =
(
from appNode in dataNode.Elements("appOptions")
select new AppOptionsObj
{
win7Compat = appNode.Element("Win7Compat"),
win7x64Compat = appNode.Element("Win7x64Compat")
}
).SingleOrDefault(),
}
).ToList();