Suppose I have the following XML format.
<data>
<appName>Microsoft Word</appName>
<appId>123</appId>
</data>
Where there are multiple data trees within the XML, I have the following code to build a list of data objects.
List<DataObj> dataObjList =
(
from dataNode in xmlDoc.Elements("data")
select new DataObj
{
appName = dataNode.Element("appName"),
appId = dataNode.Element("appId")
}
).ToList();
However, I'm running into problems if I add an additional tree under the data tag, like so:
<data>
<appName>Microsoft Word</appName>
<appId>123</appId>
<appOptions>
<Win7Compat>true</Win7Compat>
<Win7x64Compat>false</Win7x64Compat>
</appOptions>
</data>
And I use the following code:
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();
My appOptions object is always being treated as null. I have a feeling I'm not parsing the sub tree properly.
The problem is that you as casting with as AppOptionsObj
but your Select
is actually returning an IEnumerable<AppOptionsObj>
so the cast results in a null
. You probably want to use SingleOrDefault()
to return the single instance instead:
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();
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.