我正在尝试找到一种方法来获取XmlNodeList并对其进行反序列化。
我将需要使用XmlNodeList obj,并通过将其转换为序列化程序可以使用的内容使其准备好进行反序列化。
任何建议?
string fileLoc = @"File.xml";
XmlDocument xdoc = new XmlDocument();
xdoc.Load(fileLoc);
XmlNodeList ndlist = xdoc.SelectNodes("//DConfig/ConfigValue/UrlListValues/UrlInfo");
UrlListValues myObject;
XmlSerializer mySerializer = new XmlSerializer(typeof(UrlListValues));
FileStream myFileStream = new FileStream(fileLoc, FileMode.Open);
// *** This is where the problem starts. Cannot cast as UrlListValues
myObject = (UrlListValues)mySerializer.Deserialize(myFileStream);
foreach (UrlInfo xn in myObject)
{
// Do stuff
}
答案 0 :(得分:4)
您必须选择父节点并对其进行反序列化。对你而言,它可能是这样的:
XmlNode node= xdoc.SelectSingleNode("//DConfig/ConfigValue/UrlListValues");
XmlSerializer ser = new XmlSerializer(typeof(UrlListValues));
var deser = (UrlListValues)ser.Deserialize(new StringReader(node.OuterXml));
这也可以使用XDocument完成,使用类似:
string fileLoc = @"File.xml";
XDocument xdoc = XDocument.Load(fileLoc);
XmlSerializer mySerializer = new XmlSerializer(typeof(UrlListValues));
XElement urlListValuesEl = xdoc.Root.Descendants("UrlListValues").First();
myObject = (UrlListValues)mySerializer.Deserialize(urlListValuesEl.CreateReader());
(编辑)
另一个想法 - 你可以直接使用XmlReader
轻松地做到这一点:
myObject myobj = null;
using(XmlReader reader = XmlReader.Create(fileLoc))
{
if (reader.ReadToFollowing("UrlListValues")
{
XmlSerializer ser = new XmlSerializer(typeof(UrlListValues));
myobj = (UrlListValues)ser.Deserialize(reader.ReadSubTree());
}
else
{
throw Exception("Failed to find node");
}
}
答案 1 :(得分:1)
在我的练习中,我发现使用XmlDocument
课程非常尴尬。
我建议使用名为XDocument
的“更新”实现。
所以解决方案可能如下所示:
var doc = XDocument.Parse("myFile.xml");
var uris = doc.Element("root").Elements("Cars").Select(p =>
new UrlListValues
{
Name = p.Attribute("Name"),
URL = p.Element("URL")
});
以下是一些如何使用XDocument类的其他示例 Parse xml using LINQ to XML to class objects