修改 Json 字符串的元素(在 C# 中)
Modifying element of Json string (in C#)
我正在尝试在 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'
知道我做错了什么以及如何修改我的表单属性 "code"?
这是我正在使用的XML:
<Form code="XYZ">
<Info>Data</Info>
.....
谢谢!
使用 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
。
更新
您的代码失败的原因是您在转换为 json 时通过在此处传递 true
剥离了 XML 根元素名称:
string formJsonString = JsonConvert.SerializeXmlNode(serializedFormXml, Newtonsoft.Json.Formatting.None, true);
因此转换回来的时候需要把它加回去:
var xml = JsonConvert.DeserializeXmlNode(formJsonObj.ToString(), serializedFormXml.DocumentElement.Name).ToString();
我正在尝试在 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'
知道我做错了什么以及如何修改我的表单属性 "code"?
这是我正在使用的XML:
<Form code="XYZ">
<Info>Data</Info>
.....
谢谢!
使用 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
。
更新
您的代码失败的原因是您在转换为 json 时通过在此处传递 true
剥离了 XML 根元素名称:
string formJsonString = JsonConvert.SerializeXmlNode(serializedFormXml, Newtonsoft.Json.Formatting.None, true);
因此转换回来的时候需要把它加回去:
var xml = JsonConvert.DeserializeXmlNode(formJsonObj.ToString(), serializedFormXml.DocumentElement.Name).ToString();