【问题标题】:C# convert JSON to XML, but ignore some propertiesC# 将 JSON 转换为 XML,但忽略某些属性
【发布时间】:2016-06-20 16:17:29
【问题描述】:

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

【问题讨论】:

  • 您想要彻底改变文档的结构。您应该将其读入一个对象并在写回之前操作该对象。

标签: c# json xml


【解决方案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");

【讨论】:

    【解决方案2】:

    您可能希望将 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");
    

    【讨论】:

    • 感谢您的回复。您的示例将如何改变“州”和“城市”节点是动态的,即实际的州和城市名称?例如“AK”和“安克雷奇”。有没有办法定位节点位置而不是实际名称?
    • 您需要按名称/ID 获取或迭代 AK 的父级的子级
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2019-09-26
    • 2021-10-26
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多