我试图实现的是将JObject转换为XML文档,然后从XML文档中提取外部XML。这背后的原因是通过Azure通知中心将结果作为推送通知发送。
我想得到的是:
<toast>
<visual>
<binding template="ToastGeneric">
<text id="1">Message</text>
</binding>
</visual>
</toast>
我尝试过的:
JObject notificationPayload = new JObject(
new JProperty("toast",
new JObject(
new JProperty("visual",
new JObject(
new JProperty("binding",
new JObject(
new JProperty("@template", "ToastGeneric"),
new JProperty("text", notificationMessage,
new JProperty("@id", "1")))))))));
上面的代码抛出了一个异常:Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray.
所以我尝试的是:
JObject notificationPayload = new JObject(
new JProperty("toast",
new JObject(
new JProperty("visual",
new JObject(
new JProperty("binding",
new JObject(
new JProperty("@template", "ToastGeneric"),
new JProperty("text", notificationMessage,
new JObject(
new JProperty("@id", "1"))))))))));
上面的代码给了我一个结果,但不是预期的结果。我得到的是:
<toast>
<visual>
<binding template="ToastGeneric">
<text>Message</text>
<text id="1" />
</binding>
</visual>
</toast>
要从JObject中提取Xml,我使用以下方法:
string jsonStringToConvertToXmlString = JsonConvert.SerializeObject(notificationPayload);
XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonStringToConvertToXmlString);
return doc.OuterXml;
问题:如何将id属性赋予相同的Text属性
基本上,不要使用面向JSON的工具来构造XML。如果您已经拥有JSON,那么使用JSON.NET将其转换为XML是有意义的,但由于您是从头开始构建它,因此使用LINQ to XML:要干净得多
XDocument doc = new XDocument(
new XElement("toast",
new XElement("visual",
new XElement("binding",
new XAttribute("template", "ToastGeneric"),
new XElement("text",
new XAttribute("id", 1),
"Message"
)
)
)
)
);