在.NET中使用XmlSerializer将子XML元素序列化为字符串的问题
解决XmlSerializer解析嵌套XML内容为字符串的问题
嘿,这个问题我之前处理过!你判断的完全正确——报错的根源就是<B>节点里嵌套的完整XML内容。默认情况下,XmlSerializer会把<B>当成普通元素解析,可里面的<INPUT>标签会让它误以为这是一个需要映射到复杂类型的节点,但你的模型里b定义的是string类型,类型不匹配自然就抛出异常了。
当然可以把<B>的内容序列化为字符串变量,这里有两种实用的方案:
方案1:改用XmlNode类型(简单快捷)
把b字段的类型从string改成XmlNode(或者更具体的XmlElement),XmlSerializer会自动把<B>里的整个XML结构解析成XmlNode对象,之后你可以通过OuterXml属性获取对应的字符串内容。
修改后的模型代码:
<XmlRoot("INPUT")> Public Class Input <XmlElement("A")> Public a As String <XmlElement("B")> Public b As XmlNode ' 替换为XmlNode类型 End Class
使用示例:
Dim serializer As New XmlSerializer(GetType(Input)) Using reader As New StringReader(yourXmlString) Dim inputObj = DirectCast(serializer.Deserialize(reader), Input) Dim bContent As String = inputObj.b.OuterXml ' 得到<B>内部的XML字符串 End Using
这个方案的优点是不用写额外的序列化逻辑,缺点是b的类型不是直接的string,需要手动转换一下。
方案2:实现IXmlSerializable接口(保持string类型)
如果你一定要让b保持string类型,可以通过实现IXmlSerializable接口来自定义序列化和反序列化的逻辑,手动读取<B>节点的内部内容并转为字符串。
修改后的模型代码:
<XmlRoot("INPUT")> Public Class Input Public a As String Public b As String Public Function GetSchema() As XmlSchema Implements IXmlSerializable.GetSchema Return Nothing End Function Public Sub ReadXml(reader As XmlReader) Implements IXmlSerializable.ReadXml ' 读取根节点 reader.ReadStartElement("INPUT") ' 读取A节点的内容 a = reader.ReadElementContentAsString("A", "") ' 读取B节点的内部XML内容作为字符串 reader.ReadStartElement("B") b = reader.ReadInnerXml() ' 直接获取<B>内部的所有XML文本 reader.ReadEndElement() ' 关闭根节点 reader.ReadEndElement() End Sub Public Sub WriteXml(writer As XmlWriter) Implements IXmlSerializable.WriteXml ' 写入A节点 writer.WriteElementString("A", a) ' 写入B节点,把字符串作为原始XML内容写入 writer.WriteStartElement("B") writer.WriteRaw(b) writer.WriteEndElement() End Sub End Class
这个方案的优点是b始终是string类型,完全符合你的需求;缺点是需要自己处理XML的读写逻辑,相对繁琐一点,但灵活性更高。
两种方案都能解决你的问题,根据实际场景选就好啦!
内容的提问来源于stack exchange,提问作者Muhammad Faisal
相关产品推荐
相关产品推荐

