2016-01-21 86 views
0

我正在试图找到一种方法来接受XmlNodeList并反序列化它。将XmlNodeList转换为XmlDocument,或者流

我将需要采取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

你能分享你的xml吗? –

回答

3

你必须选择父节点和反序列化。对于你的话,大概是这样的:

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

在我的实践中,我发现使用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

+0

这很好,但会失去使用'XmlSerializer'的好处 - 实体可能比两个属性/元素复杂得多,而且这个代码需要同步以便对类进行任何更改。 –

+0

正如Dan所说 - 没有什么能够阻止你在select语句中使用XmlDserializer – Marty