讀取this article後,我已決定與XmlReader
更新(使用XmlDocument
)以下代碼:使用XhtmlTextWriter與XmlTextReader的
呈現控件
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
?
編輯
按喬恩斯基特的答案,這裏是更新。我們的想法是要破滅的每個元素後換行:
美化前:
<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聲明。
你是純粹出於性能原因這麼做嗎?你有證據表明加載XML實際上是緩慢的部分嗎?我用這個代碼做的第一件事是用'StringBuilder'替換字符串連接(傳遞給'recursiveOperation',所以只有其中一個)。 –
@JonSkeet,是的表現是這裏主要關心的。正如文章中提到的那樣,「XmlTextReader」和「Linq to Xml」是獲勝者。我認爲'XmlDocument'是緩慢的和種類貶值。 – Annie
那麼你已經有了一個基準測試工具,所以你可以*測量*你的表現?如果你還沒有,那麼在開始修改代碼之前,這是第一件要做的事情。 'XmlDocument'肯定不會被棄用,儘管我不會在新代碼中使用它,除非必須。我懷疑你的很多時間實際上會花在重新分析(當你設置InnerXml屬性時)。 –