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

Converting XDocument to JSON with XHTML node using 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 有很多很棒的功能,我担心我可能会错过。

这是你想要的吗?它为 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:

之前,将 <Div> 元素替换为相应的 XML 字符串文字
        // 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 });