2016-06-20 7 views
0

Ich habe eine JSON-Datei, die ich in XML konvertieren muss. Ich bin in der Lage, die Umwandlung zum Arbeiten zu erhalten, Newtonsoft.Json verwendend, aber ich möchte die Knotenstruktur ändern und einige Werte beseitigen. Siehe unten:C# JSON in XML konvertieren, aber einige Eigenschaften ignorieren

Format von JSON-Eingang:

{ 
"state": { 
    "city": [{ 
     "property1": "value1", 
     "property2": "value2", 
     ... 
     "property12": "value12" 
    }] 
} 

}

Mit diesem Code:

string json = File.ReadAllText("input.json"); 
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json, "root"); 
doc.Save("output.xml"); 

gibt mir diese für XML:

<root> 
<state> 
    <city> 
     <property1>value1</property1> 
     <property2>value2</property2> 
     ... 
     <property12>value12</property12> 
    </city> 
</state> 
</root> 

Aber was ich brauche, ist:

<root> 
<location> 
    <property1>value1</property1> 
    <property2>value2</property2> 
    <property3>value3</property3> 
</location> 
</root> 

Ich brauche die Struktur der XML-Ausgabe zu ändern und nur einige der Eigenschaften wählen. Wie kann ich das machen?

+0

Sie möchten die Struktur des Dokuments vollständig ändern. Sie sollten es in ein Objekt einlesen und das Objekt manipulieren, bevor Sie es zurückschreiben. – Jonesopolis

Antwort

1

Sie können Ihren JSON in JObject analysieren und unerwünschte Eigenschaften entfernen, bevor Sie ihn in XML konvertieren oder Knoten aus XML entfernen, bevor Sie ihn in eine Datei schreiben. Betrachten Sie die folgende (ausführlich für Klarheit):

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

Vielen Dank für die Antwort. Wie würde sich Ihr Beispiel ändern, wenn die Knoten "Staat" und "Stadt" dynamisch sind, d. H. Die tatsächlichen Namen von Staat und Stadt? Zum Beispiel "AK" und "Anchorage". Gibt es eine Möglichkeit, die Knotenposition anstelle des tatsächlichen Namens zu bestimmen? – PixelPaul

+0

Sie müssen nach Name/ID oder iterieren Kinder von was auch immer-Eltern-of-AK –

1

Argumentieren, konnte man nur einen Teil des json in XML konvertieren.

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