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

Posted

技术标签:

【中文标题】如何使用 DataContractSerializer 从 XMLDocument 的单个节点反序列化?【英文标题】:How can I use DataContractSerializer to deserialize from a single node of an XMLDocument? 【发布时间】:2011-01-12 15:44:42 【问题描述】:

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

在这段代码 sn-p 中,我从文件流中反序列化一个 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 是什么样的?

【问题讨论】:

可能性似乎是将节点转换为内存流或将其复制到新文档,但似乎应该有更简单的方法。 【参考方案1】:

除非有更好的流式传输方式,否则这里有一个使用内存流的解决方案:

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 相关问题。

【讨论】:

【参考方案2】:

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

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))

【讨论】:

以上是关于如何使用 DataContractSerializer 从 XMLDocument 的单个节点反序列化?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?