.NET 4.5 WinForms生成XML时Description字段取消特殊字符转义方案
实现方案
XML 规范强制要求属性值中的特殊字符(&、<、>、"、')必须转义,如果你强行在属性值中放未转义的双引号,生成的XML会是非法格式,无法被标准解析器识别。结合你提到第三方DTD已经将该字段标记为CDATA类型,最优方案是将Description从LineItem的属性调整为包含CDATA块的子元素,既符合XML规范,也能满足原始字符不转义的要求。以下是两种可直接落地的实现方式:
方案1:修改SQL查询直接生成带CDATA的Description字段
调整原SQL的查询逻辑,直接生成包含CDATA的Description子节点,无需后续代码处理:
SELECT SrNo as '@Number', -- 生成带CDATA的Description子节点 (SELECT '<![CDATA[' + PartsDesc + ']]>' AS Description FOR XML PATH(''), TYPE), QtyApproved as '@Quantity', UOMCode as '@MeasureUOM', -- 原有Section子查询逻辑保持不变 (SELECT DeptName as '@DepartmentType',CatDesc as '@Name',ModelDesc as '@ModelNumber',LineItem.DwnNo as '@DrawingNumber' FROM MyViewMaster where MasterID = LineItem.MasterID FOR XML path ('Section'), Type) FROM MyViewDetails LineItem WHERE LineItem.MasterID = 4567809 AND StatusID <> 3 ORDER BY SrNo FOR XML PATH('LineItem'), ROOT('Data'), TYPE
方案2:保留现有SQL逻辑,在.NET代码中处理XML节点
如果你不想调整SQL,可以在拿到xmlLineItems对象后,手动遍历节点调整格式,VB.NET代码片段如下:
' 原有代码执行完xmlLineItems.Load(xreader)后添加以下逻辑 For Each node As XmlElement In xmlLineItems.SelectNodes(".//LineItem") ' 读取原属性值,系统会自动解码得到原始未转义的文本 Dim originalDesc As String = node.GetAttribute("Description") ' 删除原有Description属性 node.RemoveAttribute("Description") ' 创建带CDATA的Description子节点 Dim cdataNode As XmlCDataSection = xmlLineItems.CreateCDataSection(originalDesc) Dim descElement As XmlElement = xmlLineItems.CreateElement("Description") descElement.AppendChild(cdataNode) ' 将子节点插入到LineItem的最前面 node.InsertBefore(descElement, node.FirstChild) Next ' 后续转换为elements的逻辑保持不变即可 Dim lists As XmlNodeList = xmlLineItems.SelectNodes(".//LineItem") elements = lists.Cast(Of XmlNode)().[Select](Function(node) XDocument.Parse(node.OuterXml).Root)
处理后的LineItem节点示例如下,CDATA块内的内容不会被转义,完全符合第三方要求:
<LineItem Number="20" Quantity="3" MeasureUOM="PCE"> <Description><![CDATA[HAND SHOWER CHROMED, 1/2"]]></Description> <Section DepartmentType="HouseKeeping" Name="Accessories" ModelNumber="" DrawingNumber="" /> </LineItem>
特殊兼容方案
如果第三方强制要求Description必须作为属性存在、不接受子元素格式,只能在最终输出XML字符串时做正则替换,该方案生成的XML不符合W3C标准,仅适用于第三方解析器不遵循标准的场景:
Dim xmlStr As String = xmlLineItems.OuterXml ' 仅替换Description属性值中的转义字符 xmlStr = System.Text.RegularExpressions.Regex.Replace(xmlStr, "Description=""([^""]*)""", Function(m) Dim rawVal = System.Web.HttpUtility.HtmlDecode(m.Groups(1).Value) ' 按你的需求将双引号替换为两个双引号 rawVal = rawVal.Replace("""", """""") Return $"Description=""{rawVal}""" End Function) ' 直接将xmlStr写入文件即可
内容的提问来源于stack exchange,提问作者Shri
相关产品推荐
相关产品推荐

