带有特殊字符的 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的主要内容,如果未能解决你的问题,请参考以下文章

在 xml 中保留特殊字符

如何将特殊字符原样写入 XML 文件

xml保存特殊符号的问题

将带有命名空间和属性的 XML 转换为 C# 模型类

使用 C# 使用特殊字符写入 XML 文档

.NET 5.0 中的 xslt PDF 转换:特殊字符问题