You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:54:04