- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
获取混合内容的最佳方法是什么body
下面代码中的元素?该元素可能包含 XHTML 或文本,但我只希望其内容为字符串形式。 XmlElement
类型有 InnerXml
这正是我所追求的属性(property)。
编写的代码几乎 可以满足我的要求,但包括周围的 <body>
... </body>
元素,我不想要。
XDocument doc = XDocument.Load(new StreamReader(s));
var templates = from t in doc.Descendants("template")
where t.Attribute("name").Value == templateName
select new
{
Subject = t.Element("subject").Value,
Body = t.Element("body").ToString()
};
最佳答案
我想看看这些建议的解决方案中哪个效果最好,所以我进行了一些比较测试。出于兴趣,我还将 LINQ 方法与 Greg 建议的普通老式 System.Xml 方法进行了比较。这种变化很有趣,但出乎我的意料,最慢的方法比最快的方法慢 3 倍多。
按最快到最慢排序的结果:
方法
我使用了一个包含 20 个相同节点(称为“提示”)的 XML 文档:
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
上面显示为秒的数字是提取 20 个节点的“内部 XML”,连续 1000 次,并取 5 次运行的平均值(平均值)的结果。我没有包括将 XML 加载和解析为 XmlDocument
(对于 System.Xml 方法)或 XDocument
(对于所有其他人)。
我使用的 LINQ 算法是:(C# - 所有采用 XElement
“parent”并返回内部 XML 字符串)
创建阅读器:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
使用字符串连接聚合:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
字符串生成器:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
String.Join 数组:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
数组上的 String.Concat:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
我没有在这里展示“Plain old System.Xml”算法,因为它只是在节点上调用 .InnerXml。
结论
如果性能很重要(例如,大量 XML,频繁解析),我会每次都使用 Daniel 的 CreateReader
方法。如果您只是做一些查询,您可能想要使用 Mike 的更简洁的聚合方法。
如果您在具有大量节点(可能有 100 个)的大型元素上使用 XML,您可能会开始看到使用 StringBuilder
优于聚合方法的好处,但不会超过 创建阅读器
。我不认为 Join
和 Concat
方法在这些情况下会更有效,因为将大列表转换为大数组的代价(在这里甚至很明显较小的列表)。
关于.net - 获取 XElement 的 InnerXml 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!