c# - 如何在 C# 中使用添加的自定义标签将 JSON 转换为 XML
问题描述
我有一些这种格式的示例 JSON:
{
"id": "532-513jg-5ujkl-5jiklf",
"externalGuid": "93804jlkfes",
"tagNumber": "2KMA",
"project": {
"id": "532kg-fw13jg-553klal-5jiklf",
"projectName": "Test",
"projectId": "1"
},
"properties": [
{
"id": "jkl39-jkl39084-agd208-hh82a9",
"name": "Weight",
"value": "1000",
"statusCode": {
"name": "Accepted",
"code": 1
}
},
{
"id": "jkl39-jkl384-123208-hh82a9",
"name": "Length",
"value": "10",
"statusCode": {
"name": "Not Accepted",
"code": 3
}
}
]
}
我想将其转换为 XML,所以我执行以下操作:
XmlDocument node = JsonConvert.DeserializeXmlNode(jsonString, "tag");
这给了我以下 XML:
<tag>
<id>532-513jg-5ujkl-5jiklf</id>
<externalGuid>93804jlkfes</comosUID>
<tagNumber>2KMA</tagNumber>
<project>
<id>532kg-fw13jg-553klal-5jiklf</id>
<projectName>Test</projectName>
<projectId>1</projectId>
</project>
<properties>
<id>jkl39-jkl39084-agd208-hh82a9</id>
<name>Weight</name>
<value>1000</value>
<statusCode>
<name>Accepted</name>
<code>1</code>
</statusCode>
<properties>
<id>jkl39-jkl384-123208-hh82a9</id>
<name>Length</name>
<value>10</value>
<statusCode>
<name>Not Accepted</name>
<code>3</code>
</statusCode>
</properties>
</tag>
这几乎是我想要的。然而,将要导入 XML 的系统需要一种稍微不同的格式。它希望每个属性都以<property>
标签开头和结尾。所以属性数组看起来像这样:
<properties>
<property>
<id>jkl39-jkl39084-agd208-hh82a9</id>
<name>Weight</name>
<value>1000</value>
<statusCode>
<name>Accepted</name>
<code>1</code>
</statusCode>
</property>
<property>
<id>jkl39-jkl384-123208-hh82a9</id>
<name>Length</name>
<value>10</value>
<statusCode>
<name>Not Accepted</name>
<code>3</code>
</statusCode>
</property>
</properties>
如何使 XML 与此模板匹配?也就是说,将properties
标签替换为property
,并将所有标签包装property
在properties
父标签中。
解决方案
要更改输入的格式,您应该首先将 JSON 反序列化为匹配模型,然后您可以使用 System.Xml.Linq 按顺序导出节点并构建任何您想要的结构。
Model model = JsonConvert.DeserializeObject<model>(jsonString);
var xml = new XElement("properties",
new XElement("property",
new XElement("id", model.Id),
new XElement("name", model.Name) /*and so on*/));
看起来要写很多东西,但实际上你可以用 XML 做任何你想做的事情。您可以准备方法来处理模型并对其进行调整,但这取决于您的要求。
您还可以创建另一个结构与 xml 文件结构相对应的模型,然后您必须使用原始节点中的数据填充该模型,但这看起来像是很多不必要的工作。我个人将使用 System.Xml.Linq 来完成此类任务。
推荐阅读
- html - 相对
- python - Simpler way to get the list of words that has only 1 letter difference? (python)
- php - 'CI_Controller' 未找到
- c# - 当从 SQLCLR 调用但在 SSIS 脚本任务中工作时,带有 Remove=true 的 WinSCP Session.PutFiles 获取“删除文件系统错误时出错。代码:5”
- .net - Timers.Timer 中 AutoReset 的行为
- java - “build/generated/source/r”下的各种文件夹上的“无法删除路径”
- c# - foreach 语句不能对 'Task< 类型的变量进行操作
var contacts = (from c in _db.Contacts join dgm in _db.DistributionGroupMembers on c.Id equals dgm.ContactId join dg in _db.Distribution
- javascript - Canvas HTML fillText letters to not animate only shadows
- vue.js - 如何阻止 vue cli3 构建将 vue.js.min 包含在我的 chunk-vendors.js 文件中?
- excel - 如果行的一个单元格中的值在下一行的同一列中重复,则删除行