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

XML转JSON动态对象后,如何处理含特殊字符的字段?

处理XML转JSON时XML声明变为"?xml"键的问题

这个情况其实是Newtonsoft.Json处理XmlDocument的默认行为导致的——XmlDocument会把XML声明(<?xml version="1.0" encoding="utf-8"?>)当作一个XmlDeclaration节点,序列化时就会被转成"?xml"这个键值对。下面给你几个实用的解决方法:

方法1:加载XML后移除声明节点

直接在序列化前从XmlDocument中移除XML声明节点,这样序列化后的JSON就不会包含这个键了:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

// 检查并移除XML声明节点
if (doc.FirstChild is XmlDeclaration xmlDeclaration)
{
    doc.RemoveChild(xmlDeclaration);
}

string jsonText = JsonConvert.SerializeXmlNode(doc);
dynamic obj = JsonConvert.DeserializeObject<object>(jsonText);

方法2:序列化时忽略XML声明

通过配置XmlNodeConverter的参数,让序列化过程自动跳过XML声明,这种方式不需要修改原XML文档:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

// 配置转换器,忽略XML声明
var xmlConverter = new XmlNodeConverter { OmitXmlDeclaration = true };
string jsonText = JsonConvert.SerializeObject(doc, xmlConverter);
dynamic obj = JsonConvert.DeserializeObject<object>(jsonText);

方法3:从已生成的JSON对象中移除该键

如果已经完成了序列化,只想清理最终的dynamic对象,可以先转成JObject再移除"?xml"属性:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

// 转成JObject移除不需要的键
JObject jsonObj = JsonConvert.DeserializeObject<JObject>(jsonText);
jsonObj.Remove("?xml");

dynamic obj = jsonObj;

根据你的实际场景选就行,前两种方法是从源头避免生成这个键,第三种是事后清理,都能解决问题。

内容的提问来源于stack exchange,提问作者silent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:29