C#将JSON转换为XML,但忽略了一些属性

时间:2016-06-20 16:17:30

标签: c# json xml

我有一个需要转换为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的结构并仅选择一些属性。我怎么能这样做?

2 个答案:

答案 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");