如何使用DataContractSerializer从XMLDocument的单个节点反序列化?

时间:2011-01-12 15:44:43

标签: .net xml-serialization datacontractserializer

DataContractSerializer在ReadObject中使用的读者似乎是基于流的。我已经有了一个XMLDocument,我想反序列化该文档的一部分。

在这段代码中,我从文件流中反序列化MyItem对象:

Dim fs As New FileStream("c:\myinputfile.xml", FileMode.Open)
Dim reader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(fs, New XmlDictionaryReaderQuotas())
Dim ser As New DataContractSerializer(GetType(MyItemClass))
Dim deserializedMyItem As ClassTemplate = CType(ser.ReadObject(reader, True), MyItemClass)

但是,如果我只想反序列化文档的一部分,那该怎么办呢。

Dim MyItemNode as Xml.XmlNode = parentDoc.selectSingleNode("MyItemElementName")
Dim deserializedMyItem As MyItemClass = getMyItemFromNode(MyItemNode)

getMyItemFromNode是什么样的?

2 个答案:

答案 0 :(得分:0)

除非有更好的流媒体方式,否则这是使用内存流的解决方案:

Function getMyItemFromNode(ByVal itemNode as Xml.XmlNode) as MyItemClass
    Dim stm As New MemoryStream()
    Dim stw  As New StreamWriter(stm)
    stw.Write(itemNode.OuterXml)
    stw.Flush()
    stm.Position = 0
    Dim reader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(stm, New XmlDictionaryReaderQuotas())
    Dim ser As New DataContractSerializer(GetType(MyItemClass))
    Return CType(ser.ReadObject(reader, True), MyItemClass)

End Function 

将其推送到流的代码从this response传到相关问题。

答案 1 :(得分:0)

使用[CreateDictionaryReader](http://msdn.microsoft.com/en-us/library/system.xml.xmldictionaryreader.createdictionaryreader.aspx) with an XmlReader`指向您想要的节点:

Dim doc As XmlDocument = new XmlDocument()
' fill it

Dim nav as XPathNavigator = doc.CreateNavigator()
Dim docReader As XmlReader = nav.ReadSubTree()
Dim reader As XmlDictionaryReader = _
    XmlDictionaryReader.CreateDictionaryReader(docReader)
Dim ser As New DataContractSerializer(GetType(MyItemClass))