2016-06-20 76 views
0

我有一個JSON文件,我需要將其轉換爲XML。我能夠使用Newtonsoft.Json獲得轉換工作,但我想修改節點結構並消除一些值。請看下圖:JSON輸入C#將JSON轉換爲XML,但忽略一些屬性

格式:

{ 
"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

你想完全改變文檔的結構。您應該將它讀入一個對象並在寫回之前操作該對象。 – Jonesopolis

回答

1

您可能想將JSON解析爲JObject,並在將其轉換爲XML之前移除不需要的屬性,或者在將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"); 
+0

謝謝你的回覆。您的示例如何改變是「州」和「城市」節點是動態的,即實際的州和城市名稱?例如「AK」和「安克雷奇」。有沒有一種方法來定位節點的位置,而不是實際的名稱? – PixelPaul

+0

您需要通過名稱/編號或迭代AK的父母的子女 –

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