带有特殊字符的 XML 在 C# 中转换为 Json
Posted
技术标签:
【中文标题】带有特殊字符的 XML 在 C# 中转换为 Json【英文标题】:XML with special chars converting to Json in C# 【发布时间】:2020-03-13 21:59:02 【问题描述】:我正在尝试将带有特殊字符(Tab)的 XML 转换为 Json 以获取以下 xml:
<Request>
<HEADER>
<uniqueID>2019111855545921230</uniqueID>
</HEADER>
<DETAIL>
<cmnmGrp>
<coNm>IS XYZ INC.</coNm>
<embossedNm>ANNA ST UART</embossedNm>
<cMNm>ST UART/ANNA K</cMNm>
<cmfirstNm>ANNA</cmfirstNm>
<cmmiddleNm>K</cmmiddleNm>
<cm2NdLastNm>ST UART</cm2NdLastNm>
</cmnmGrp>
</DETAIL>
</Request>
我在 Json 中的输出低于:
"Request":
"HEADER": "uniqueID": "2019111855545921230" ,
"DETAIL":
"cmnmGrp":
"coNm": "IS XYZ INC.",
"embossedNm": "ANNA ST\t\tUART",
"cMNm": "ST\t\tUART/ANNA K",
"cmfirstNm": "ANNA",
"cmmiddleNm": "K",
"cm2NdLastNm": "ST\t\tUART"
以上响应包含特殊字符。如何删除制表符空格的 \t 。我正在使用以下代码进行 xml 到 Json 的转换:
var xml = @"Input xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
string json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.None);
我期待最终的 Json 输出如下:
"Request":
"HEADER": "uniqueID": "2019111855545921230" ,
"DETAIL":
"cmnmGrp":
"coNm": "IS XYZ INC.",
"embossedNm": "ANNA ST UART",
"cMNm": "ST UART/ANNA K",
"cmfirstNm": "ANNA",
"cmmiddleNm": "K",
"cm2NdLastNm": "ST UART"
任何人都可以帮助解决这个问题。 谢谢。
【问题讨论】:
\t
是 JSON 转义选项卡的方式...我在这里没有发现任何问题。见***.com/a/19176131/2957232
不清楚你想要的最终结果是什么。标签完全删除?在转换之前修改 XML 文档可能是最简单的方法
如果你想重新打开标签(我不明白为什么)你可以做类似json.Replace("\\t", "\t");
请根据您的期望编辑问题,而不是使用 cmets。但从根本上说,在 JSON 中有一个文字选项卡和 \t
在所有解析器下应该是等效的。见tools.ietf.org/html/rfc8259#section-7
【参考方案1】:
不要混淆数据和表示!
ANNA ST\t\tUART
- 是字符串“ANNA ST UART”的 JSON 表示形式。
现在做 JSON 解析,你会得到一个没有\t
的字符串。
var obj = JObject.Parse(json);
var value = obj["Request"]["DETAIL"]["cmnmGrp"]["embossedNm"];
Console.WriteLine(value); // ANNA ST UART
【讨论】:
【参考方案2】:\t
不仅仅是固定数量的空格,它取决于从行首开始的位置以及读者设置的最大制表符大小(通常为 8)。如果您希望它们出现在 JSON 中,就像它们出现在 XML 中一样,那么您必须以文本格式读取 XML 文件,并在转换为 JSON 之前根据它们的位置以编程方式将制表符替换为空格。假设您知道阅读器的最大标签大小:它可能是 4。
下面是两个相同的行,具有相同的“abc\t”值,假设每个制表符最多 8 个空格:
<value>abc </value>
<value>abc </value>
一般来说,保持密切关注是正确的,虽然它不适合你。
JSON 规范将制表符定义为两个字符 \t
,并且您的快照是正确的。如果您检索包含 \t
的值,则 JSON 解析器应将它们替换为制表符。取决于你需要什么;如果您不介意 XML 文件中的初始选项卡位置,您可能已经可以了。
【讨论】:
以上是关于带有特殊字符的 XML 在 C# 中转换为 Json的主要内容,如果未能解决你的问题,请参考以下文章