修改Json字符串的元素(在C#中)

时间:2015-04-13 22:28:33

标签: c# serialization json.net

我正在尝试使用C#中的Json修改XML字符串的属性。目前我正在做以下事情:

XmlDocument serializedFormXml = new XmlDocument();
serializedFormXml.LoadXml(mySerializedForm);

string formJsonString = JsonConvert.SerializeXmlNode(serializedFormXml, Newtonsoft.Json.Formatting.None, true);
JObject formJsonObj = JObject.Parse(formJsonString);
formJsonObj["@code"] = "myNewValue";
var xml = JsonConvert.DeserializeXmlNode(formJsonObj.ToString()).ToString();

当我这样做时,我会在最后一行得到一个例外: 无法将类型为“Newtonsoft.Json.Converters.XmlDocumentWrapper”的对象强制转换为“Newtonsoft.Json.Converters.IXmlElement”

任何想法我的错误以及如何修复我的表单属性“代码”?

这是我正在使用的XML:

<Form code="XYZ">
   <Info>Data</Info>
   .....

谢谢!

1 个答案:

答案 0 :(得分:0)

使用Linq-to-XML

,这将更容易
        var doc = XDocument.Parse(mySerializedForm);
        doc.Root.SetAttributeValue(doc.Root.Name.Namespace + "code", "myNewValue");
        var xml = doc.ToString();

这会丢弃XML声明。如果需要包含XML声明,则可以使用以下扩展方法:

public static class XObjectExtensions
{
    public static string ToXml(this XDocument xDoc)
    {
        using (var writer = new StringWriter())
        {
            xDoc.Save(writer);
            return writer.ToString();
        }
    }
}

然后写:

        var xml = doc.ToXml();

如果具体您需要使编码字符串显示“UTF-8”,请使用this answer中的Utf8StringWriter

<强>更新

您编码失败的原因是您通过在此处传递true转换为json时剥离了XML根元素名称:

        string formJsonString = JsonConvert.SerializeXmlNode(serializedFormXml, Newtonsoft.Json.Formatting.None, true);

因此,您需要在转换回来时将其添加回来:

        var xml = JsonConvert.DeserializeXmlNode(formJsonObj.ToString(), serializedFormXml.DocumentElement.Name).ToString();