阅读本文后,我决定使用以下代码更新以下代码(使用XmlDocument
)XmlReader
:
渲染控件
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;
}
是否有优化现有代码的空间?
我怎么会去直接实例XmlTextReader
从Control
,StringWriter
或XhtmlTextWriter
对象?还是我真的需要先渲染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] 删除。
我来说两句