将XmlNodeList转换为XmlDocument或Stream

Mic*_*itt 0 c# xml serialization

我正在尝试找到一种方法来获取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
        }
Run Code Online (Sandbox Code Playgroud)

Dan*_*eld 5

您必须选择父节点并将其反序列化。对您来说,可能是这样的:

XmlNode node= xdoc.SelectSingleNode("//DConfig/ConfigValue/UrlListValues");
XmlSerializer ser = new XmlSerializer(typeof(UrlListValues));
var deser = (UrlListValues)ser.Deserialize(new StringReader(node.OuterXml));
Run Code Online (Sandbox Code Playgroud)

也可以使用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());
Run Code Online (Sandbox Code Playgroud)

(编辑)另一种想法-您可以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");
    }
}
Run Code Online (Sandbox Code Playgroud)