gpt4 book ai didi

c# - 将 XhtmlTextWriter 与 XmlTextReader 一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 10:56:00 25 4
gpt4 key购买 nike

看完this article ,我决定用 XmlReader 更新以下代码(使用 XmlDocument):

渲染控件

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;
}

问题:

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

  • 我如何从 ControlStringWriterXhtmlTextWriter 对象直接实例化 XmlTextReader?还是我真的需要先将其呈现为 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 如何保持折叠状态,而其他所有内容(带有子节点)展开。缩进将由 Visual Studio 断言。

最佳答案

Is there a room for optimizing the existing code?

当然。我要更改的第一个地方与您加载 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();
}

您可以使用传递到 RecursiveOperation 中的单个 StringBuilder 进一步优化它,但我还没有完全掌握您的代码,无法说出来。 (这是在早上第一杯咖啡之前。)

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

How would I go about directly instantiating XmlTextReader from Control, StringWriter or XhtmlTextWriter object? Or do I really need to render it as a string first then instantiate XmlTextReader?

甚至不清楚从这些对象中的任何对象创建 XmlTextReader 意味着什么 - 它们本质上不是 XML 数据的。我认为你所得到的在我看来已经很合理了。

如果您仍然担心性能,您应该避免猜测并使用分析器来衡量时间被占用的地方。不过,您应该先为自己设定一个目标,否则您将不知道何时完成了优化。

关于c# - 将 XhtmlTextWriter 与 XmlTextReader 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19500985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com