首页 > 解决方案 > 使用 C# 在制表符分隔的文本文件中获取 CDATA 中的值

问题描述

我在列中有一个字符串值,就像在制表符分隔的文本文件中一样,并且想要提取其中的值“John Smith”并将其存储为字符串值。我尝试使用 string.Replace 但不确定我有正确实施它。

     string cdatastring = "<![CDATA[John Smith]]>";
     string expected = "John Smith"; 

如何使用 C#/.NET 方法实现它?

标签: c#xmlcdata

解决方案


您可以使用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


推荐阅读