VB.NET中如何向XML插入完整节点?类型转换报错求解
解决XML节点列表插入的类型转换错误
问题根源
你调用Salida函数时传入的xmldoc.GetElementsByTagName("file")返回的是XmlNodeList(节点集合),但函数的node参数定义为单个XmlNode对象,直接传入集合就会触发类型不匹配错误:Unable to convert an object of type 'System.Xml.XmlNodeList' to type 'System.Xml.XmlNode'。
解决方案
可以通过两种方式修复:
方案1:修改Salida函数,支持接收节点列表
修改函数的可选参数类型为XmlNodeList,遍历列表将每个节点导入后添加到目标XML文档的tx节点下(避免直接添加到根节点导致结构混乱)。
修改后的函数代码:
Public Function Salida(ByVal est As String, ByVal err As String, Optional nodeList As XmlNodeList = Nothing) As String Dim m_xmld = New XmlDocument Try m_xmld.LoadXml("<tx><estado></estado><info></info></tx>") Dim txNode As XmlNode = m_xmld.SelectSingleNode("tx") txNode.SelectSingleNode("estado").InnerText = est txNode.SelectSingleNode("info").InnerText = err If Not nodeList Is Nothing AndAlso nodeList.Count > 0 Then ' 遍历节点列表,逐个导入到当前文档后添加 For Each node As XmlNode In nodeList Dim importedNode As XmlNode = m_xmld.ImportNode(node, True) txNode.AppendChild(importedNode) Next End If Catch ex As Exception m_xmld.InnerText = "Error" End Try Return m_xmld.InnerXml End Function
调用方式保持不变:
mvarXmlSalida = Util.Salida("0", "", xmldoc.GetElementsByTagName("file"))
方案2:调用时处理节点集合,不修改原函数
如果不想改动Salida函数,可在调用前处理节点列表:
- 若确定只有一个
file节点,直接取集合第一个元素:
Dim fileNodes As XmlNodeList = xmldoc.GetElementsByTagName("file") mvarXmlSalida = If(fileNodes.Count > 0, Util.Salida("0", "", fileNodes(0)), Util.Salida("0", "", Nothing))
- 若有多个
file节点,先创建临时文档整合节点,再传入整合后的根节点:
Dim tempDoc As New XmlDocument Dim root As XmlNode = tempDoc.CreateElement("files") tempDoc.AppendChild(root) For Each node As XmlNode In xmldoc.GetElementsByTagName("file") root.AppendChild(tempDoc.ImportNode(node, True)) Next mvarXmlSalida = Util.Salida("0", "", root)
关键注意点
跨XmlDocument的节点不能直接添加,必须使用ImportNode方法导入到目标文档后再操作,否则会触发“节点属于另一个文档上下文”的错误。
内容的提问来源于stack exchange,提问作者chocano14
相关产品推荐
相关产品推荐

