使用JSON.NET将XDocument转换为使用XHTML节点的JSON

时间:2015-11-17 07:57:25

标签: json xhtml json.net

有更简单的方法吗?我真诚地担心这个LinqPad涂鸦可能过于冗长:

var xml = @"
<root attr1=""attribute one"" attr2=""attribute two"">
    <title>this is the root</title>
    <xhtml>
        <div id=""wrapper"">
            <p style=""first""><em>hello</em> world!</p>
        </div>
    </xhtml>
</root>
";

var xDoc = XDocument.Parse(xml);

Func<XNode, string> getXhtml = node =>
{
    var s = string.Empty;
    StringWriter wr = null;
    try
    {
        wr = new StringWriter();
        using(var jsonWriter = new JsonTextWriter(wr))
        {
            jsonWriter.StringEscapeHandling = StringEscapeHandling.EscapeHtml;
            new JsonSerializer().Serialize(jsonWriter, node.ToString());
        }
        s = wr.ToString();
    }
    finally
    {
        if(wr != null) wr.Dispose();
    }
    return s;
};

var escaped_xhtml = getXhtml(xDoc.Root.Element("xhtml").Element("div"));
escaped_xhtml.Dump("escaped xhtml");

var placeholder = "@rx-xhtml";

xDoc.Root.Element("xhtml").Value = placeholder;

var json = JsonConvert.SerializeXNode(xDoc.Root, Newtonsoft.Json.Formatting.Indented);

var json_final =json
    .Replace(string.Format(@"""{0}""",placeholder), escaped_xhtml);

json_final.Dump("json with escaped xhtml");

var jDoc = JObject.Parse(json_final);

escaped_xhtml = (string)jDoc["root"]["xhtml"];
escaped_xhtml.Dump("decoded xhtml");

可以合理地假设JSON.NET已经具有相当于我的getXhtml()例程。 JSON.NET有很多很棒的功能我担心我可能会错过。

1 个答案:

答案 0 :(得分:1)

这是你想要的吗?它为json_final生成相同的结果:

        // Parse the XML
        var xDoc = XDocument.Parse(xml);

        // Extract the "div" element.
        var div = xDoc.Root.Element("xhtml").Element("div");
        div.Remove();

        // Convert the remainder to a JObject.
        var jDoc = JObject.FromObject(xDoc.Root, JsonSerializer.CreateDefault(new JsonSerializerSettings { Converters = new[] { new XmlNodeConverter() } }));

        // Store the Div element as a string literal.
        jDoc["root"]["xhtml"] = div.ToString();

        // Stringify the JSON using StringEscapeHandling = StringEscapeHandling.EscapeHtml
        var json_final = JsonConvert.SerializeObject(jDoc, new JsonSerializerSettings { Formatting = Formatting.Indented, StringEscapeHandling = StringEscapeHandling.EscapeHtml });

它消除了字符串替换和getXhtml委托。请注意,StringEscapeHandling最终转换为字符串时适用,而不适用于Joken的中间转换(其中字符串文字未转义)。

更简单的是,在转换为JSON之前,用相应的XML字符串文字替换<Div>元素:

        // Parse the XML
        var xDoc = XDocument.Parse(xml);

        // Replace the DIV element with its XML string literal value
        var div = xDoc.Root.Element("xhtml").Element("div");
        div.Remove();
        xDoc.Root.Element("xhtml").Value = div.ToString();

        // Convert to JSON using StringEscapeHandling = StringEscapeHandling.EscapeHtml
        var json_final = JsonConvert.SerializeObject(xDoc, new JsonSerializerSettings { Converters = new[] { new XmlNodeConverter() }, Formatting = Formatting.Indented, StringEscapeHandling = StringEscapeHandling.EscapeHtml });