将XhtmlTextWriter与XmlTextReader一起使用

安妮

阅读本文后,我决定使用以下代码更新以下代码(使用XmlDocumentXmlReader

渲染控件

public string Rendering(Control baseControl)
{
    StringBuilder stringBuilder = new StringBuilder();

    using (StringWriter stringWriter = new StringWriter(stringBuilder))
    using (XhtmlTextWriter htmlWriter = new XhtmlTextWriter(stringWriter))
    {
        baseControl.RenderControl(htmlWriter);

        return PretifyWithNewlines(stringBuilder.ToString());
    }
}

在每个节点之后添加换行符

private string PretifyWithNewlines(string minifiedMarkup)
{   
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.XmlResolver = null;

    try
    {
        xmlDocument.LoadXml("<base>" + minifiedMarkup + "</base>");
    }
    catch // when minifiedMarkup contains the whole HTML with DTD tag defined, 
    {                                    // it throws an exception with <base>
        xmlDocument.LoadXml(minifiedMarkup);
    }

    return recursiveOperation(xmlDocument.ChildNodes)
           .Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine)
           .Replace(Environment.NewLine + "<base>" + Environment.NewLine, "")
           .Replace(Environment.NewLine + "</base>" + Environment.NewLine, "");

}

递归遍历每个节点并植入新元素

private static string recursiveOperation(XmlNodeList xmlNodeList)
{
    string result = "";

    foreach (XmlNode currentNode in xmlNodeList)
    {
        XmlNode clonedNode = currentNode;

        string interimMarkup = recursiveOperation(currentNode.ChildNodes);
        try
        {
            clonedNode.InnerXml = interimMarkup;
        }
        finally
        {
            result += Environment.NewLine + clonedNode.OuterXml + Environment.NewLine;
        }
    }
    return result;
}

问题:

  • 是否有优化现有代码的空间?

  • 我怎么会去直接实例XmlTextReaderControlStringWriterXhtmlTextWriter对象?还是我真的需要先渲染string然后实例化XmlTextReader

编辑

根据Jon Skeet的回答,这是更新。这个想法是在每个元素之后插入一个换行符:

美化之前:

<div class="tag"><span>text<span class="another-span"></span></span></div><div>Text<img src="some/relative/URL/" />namely</div>

美化之后:

 <div class="tag">
 <span>
 text
 <span class="another-span"></span>
 </span>
 </div>
 <div>
 Text
 <img src="some/relative/URL/" />
 namely
 </div>

请注意,span.another-span当其他所有内容(带有子节点)扩展时,keep如何折叠。缩进将由Visual Studio声明。

乔恩·斯基特

是否有优化现有代码的空间?

绝对。我要更改的第一位与XML的加载方式无关-它是字符串连接。我会将您的recursiveOperation方法更改为:

private static string RecursiveOperation(XmlNodeList xmlNodeList)
{
    StringBuilder result = new StringBuilder();

    foreach (XmlNode currentNode in xmlNodeList)
    {
        XmlNode clonedNode = currentNode;

        // Remove try/finally block - if an exception is thrown your
        // result will be lost anyway
        string interimMarkup = RecursiveOperation(currentNode.ChildNodes);
        clonedNode.InnerXml = interimMarkup;
        result.Append(Environment.NewLine)
              .Append(clonedNode.OuterXml)
              .Append(Environment.NewLine);
    }
    return result.ToString();
}

您可能可以使用StringBuilder传入的单个代码进一步优化此功能RecursiveOperation,但是我还没有完全掌握您的代码以至于无法说出来。(是在早上喝第一杯咖啡之前。)

就XML处理本身而言,您当前正在通过OuterXml(递归地)在每个子节点中设置节点来进行大量重新解析我怀疑如果我对您的工作有更好的了解,则可以改变整个方法。鉴于这XmlReader确实是没有的功能(没有意义),目前尚不清楚您是否应该特别注意另一篇文章。

我该如何直接从控件,StringWriter或XhtmlTextWriter对象实例化XmlTextReader?还是我真的需要先将其呈现为字符串然后实例化XmlTextReader?

目前尚不清楚XmlTextReader从这些对象中的任何一个创建一个对象甚至意味着什么-它们本身并不是XML数据我认为您所拥有的对我来说已经很合理了。

如果仍然担心性能,则应避免猜测,而应使用探查器来衡量时间。不过,您应该先为自己设定一个目标,否则您将不知道何时完成优化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将“ -Filter”与变量一起使用

来自分类Dev

将PowerMock与黄瓜一起使用

来自分类Dev

将Scrapyd与参数一起使用

来自分类Dev

将AngularJS与Liferay一起使用

来自分类Dev

将Magicline与Flexslider一起使用

来自分类Dev

将CMAttitude与CMCalibratedMagneticField一起使用

来自分类Dev

将findall与arg一起使用

来自分类Dev

将StaticPagedList与PagedListRenderOptions一起使用

来自分类Dev

将Redis与SignalR一起使用

来自分类Dev

将阵列与渗透一起使用

来自分类Dev

将ctypes与typedef一起使用

来自分类Dev

将regex与replaceAll一起使用

来自分类Dev

将SUMPRODUCT与TRANSPOSE一起使用

来自分类Dev

将MaybeT与`join`一起使用

来自分类Dev

将ShardedJedis与RedisTemplate一起使用

来自分类Dev

将Browserify与Reactjs一起使用

来自分类Dev

将Sympy与Pypy一起使用

来自分类Dev

将Kotlin与Dagger一起使用

来自分类Dev

将mciSendString与空格一起使用

来自分类Dev

将<leader>与:normal一起使用

来自分类Dev

将Disqus与星级一起使用

来自分类Dev

将TeamCity与BitBucket一起使用

来自分类Dev

将QTableView与模型一起使用

来自分类Dev

将MKTileOverlay与MKPolyLine一起使用

来自分类Dev

将dropzone与JSF一起使用

来自分类Dev

将documentMode与typescript一起使用

来自分类Dev

将$ routeProvider与$ stateProvider一起使用

来自分类Dev

将fseek与stdout一起使用

来自分类Dev

将@Produces与@Qualifier一起使用