c# - 使用 C# 在制表符分隔的文本文件中获取 CDATA 中的值
问题描述
我在列中有一个字符串值,就像在制表符分隔的文本文件中一样,并且想要提取其中的值“John Smith”并将其存储为字符串值。我尝试使用 string.Replace 但不确定我有正确实施它。
string cdatastring = "<![CDATA[John Smith]]>";
string expected = "John Smith";
如何使用 C#/.NET 方法实现它?
解决方案
您可以使用LINQ to XML方法XElement.Parse()
解析任何格式正确的 XML 文档,但是您的 CDATA 字符串<![CDATA[John Smith]]>
不是格式正确的 XML 文档,它只是一个文档片段,因为它缺少根元素。要将其转换为格式良好的 XML,您可以用合成根元素包围它,对其进行解析,然后像这样提取值:
var value = XElement.Parse("<a>" + cdatastring + "</a>").Value;
如果您cdatastring
的长度超过 42,000 个字符左右,因此添加了根元素的字符串将出现在大对象堆上ChainedTextReader
,您可以public static TextReader Extensions.Concat(this TextReader first, TextReader second)
从如何将多个 TextReaders 串在一起?通过Rex M并创建以下扩展方法:
public static class XmlExtensions
{
public static XElement ParseFragment(string xmlFragment)
{
using (var reader = new StringReader("<a>").Concat(new StringReader(xmlFragment)).Concat(new StringReader("</a>")))
{
return XElement.Load(reader);
}
}
}
然后像这样提取您的 CDATA 值:
var value = XmlExtensions.ParseFragment(cdatastring).Value;
示例工作 .Net fiddle here。
推荐阅读
- r - 如何使用 purrr/tidyverse 将 ets、auto.arima 等多个时间序列模型应用于 R 中的数据组?
- android - 将数据从数据库推送到烧瓶 Web 应用程序和 Android 设备
- visual-studio-code - vscode源控制连接到远程主机,显示时钟图标
- algorithm - BFS的时间复杂度分析
- javascript - 将 Object 作为道具传递并在 React js 中使用 map() 函数
- java - 为什么我在线程“main”java.lang.NoClassDefFoundError 错误中得到 LWJGL 异常
- wagtail - Wagtail - 页面外的流场问题?
- java - Spring Boot 中嵌入式 H2 数据库的默认名称是什么?
- python - 如果我指向其中的一个方法,GC 会清理我的对象吗?
- xml - Python lxml gives entities for cyrillic characters