我有一个需要转换为XML的JSON文件。我能够使用Newtonsoft.Json
使转换工作,但我想修改节点结构并消除一些值。见下文:
JSON输入格式:
{
"state": {
"city": [{
"property1": "value1",
"property2": "value2",
...
"property12": "value12"
}]
}
}
使用此代码:
string json = File.ReadAllText("input.json");
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json, "root");
doc.Save("output.xml");
给我这个XML:
<root>
<state>
<city>
<property1>value1</property1>
<property2>value2</property2>
...
<property12>value12</property12>
</city>
</state>
</root>
但我需要的是:
<root>
<location>
<property1>value1</property1>
<property2>value2</property2>
<property3>value3</property3>
</location>
</root>
我需要更改输出XML的结构并仅选择一些属性。我怎么能这样做?
答案 0 :(得分:1)
您可能希望将JSON解析为JObject
并删除不需要的属性,然后再将其转换为XML,或者在将节点写入文件之前从XML中删除节点。请考虑以下内容(为了清楚起见,详细说明):
string json = File.ReadAllText("input.json");
XmlDocument doc = JsonConvert.DeserializeXmlNode(json, "root");
// Get nodes
XmlNode rootNode = doc.SelectSingleNode("root");
XmlNode stateNode = rootNode.SelectSingleNode("state");
XmlNode cityNode = stateNode.SelectSingleNode("city");
// Remove unwanted "state" node
rootNode.RemoveChild(stateNode);
// Extract nodes you want to keep from "city" node
string[] propertyNames = { "property1", "property2" };
List<XmlNode> nodes = cityNode
.ChildNodes.Cast<XmlNode>()
.Where(node => propertyNames.Contains(node.Name))
.ToList();
// Add new "location" node and append
XmlNode locationNode = doc.CreateNode(XmlNodeType.Element, "location", null);
nodes.ForEach(node => locationNode.AppendChild(node));
// Append to root
rootNode.AppendChild(locationNode);
doc.Save("output.xml");
答案 1 :(得分:1)
可以说,您只能将json的一部分转换为XML。
string json = File.ReadAllText("input.json");
var inputObj = JObject.Parse(json); // Parse the Json into a JObject
var properties = inputObj["state"]["city"] // Isolate the JArray
var locationObj = new JObject; // Create a new JObject to hold only what we want
locationObj.Add("location", properties); // Create a node called location and populate it with our JArray
var locationObjString = locationObj.ToString();
var doc = JsonConvert.DeserializeXmlNode(locationObjString , "root");
doc.Save("output.xml");