- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
看完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;
}
现有代码是否有优化空间?
我如何从 Control
、StringWriter
或 XhtmlTextWriter
对象直接实例化 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/
我想使用忽略命名空间且不检查字符的 XmlTextReader。要忽略命名空间,我可以设置属性 Namespaces=false 并且不检查字符我可以使用 XmlReaderSettings.Chec
这可能是一件非常简单的事情,但我一直没能找到它,我可能只是在寻找错误的东西...... XmlTextReader --> 它是否锁定您正在阅读的文件?我正在使用 reader.Read(),仅此而已
static void ReadXml() { string a= null; double b= 0; double c= 0; XmlReader xmlReade
这是我的要求我需要反序列化一个对象,然后我需要做一些 xml 解析(我知道这听起来如何) 所以这是我的代码 XmlTextReader myFileReader = new XmlTextReader
根据list of available namespaces in a PCL project ,包含 System.Xml。但是,在引用 System.Xml 命名空间内的 XmlTextReade
XMLTextReader 使用什么解析方法?我很迷惑。萨克斯还是 Dom? 最佳答案 都不是,真的 - 这是一个 pull parser .它既不在内存中构建完整的对象模型 (DOM),也不解析整个
我是一名初级程序员,从 C# 和 Web 服务开始。 在我的网络服务的 Service.cs 文件中,我创建了一个 ReadXMLFile() 方法,我试图在其中读取现有的 XML 文件,从中获取数据
我尝试解析此 xml,但 C# 不断抛出异常,提示它包含无效字符。无法直接从messagebox中复制文字,所以我屏蔽了。 http://img29.imageshack.us/img29/694/x
我目前必须修复现有应用程序以使用 DOM interface 以外的东西的 libxml2因为事实证明它传递的 XML 文件太大以至于无法加载到内存中。 我已经将数据加载从遍历 DOM 树重写为使用
我尝试获取节点的值,但它总是返回一个空字符串。据我所知,我必须先访问节点才能阅读它,但我还没有找到一个示例/语法来完成它。我的 XMLNode 名称是“BuyNowPrice”,并且多次出现在我的 X
在保存不包含任何数据的数据表时,我在使用 C# 中的 XmlSerializer 和 XmlTextReader 时遇到了一些问题。这是一个已知问题吗?是否有解决方法?当使用 XMLSerialize
给定一个 XDocument,我如何才能获得一个 XmlTextReader 来读取它的内容? XDocument.CreateReader() 返回一个 XmlNodeReader,我需要一个 Xm
我的代码是这样的: case "Creator": br.Read(); br.MoveToContent(); // gives the content of the role
我需要在 XmlTextReader 上设置 MaxCharactersFromEntities,这是我目前的代码: xmlDocument = new XmlDocument(); xmlTextR
我试图在不扩展实体的情况下读取 XML 文档,对其进行一些操作,然后像最初一样使用未扩展的实体重新保存它。 当直接使用 XDocument 时,它加载失败,抛出异常告诉我它有未展开的实体: XDocu
我可以在 .NET 中解析 XML。现在我至少可以在 XmlTextReader 和 XDocument 之间做出选择。这两者(或框架中包含的任何其他 XML 解析器)之间是否有任何比较? 也许这可以
如何将 XmlReader 转换为 XmlTextReader? 代码片段: XmlTextReader reader = XmlTextReader.Create(pomfile.FullName)
使用 XmlTextReader.Read(),如何确定阅读器读取的内容是否为结束/结束标记? 请注意,我不是在寻找 XmlTextReader.IsEmptyElement 的用法.我正在寻找验证是
我的问题很简单,我有一个字节数组(通过套接字填充),我想将它转换成一个 XmlTextReader 对象。我该怎么做? 这行不通: byte[] buffer = new byte[5000]; //
当以 XML 格式流式传输到 XmlReader 时,出现内存不足异常!查看内存分析器,我们可以看到它一遍又一遍地调用 StringBuilder.Append,导致大量 128KB 缓冲区填满所有内
我是一名优秀的程序员,十分优秀!