从输入中删除CDATA

时间:2016-03-09 16:27:44

标签: c# asp.net xml

我得到一个包含CDATA的字符串,我想删除它。

Input : "<Text><![CDATA[Hello]]></Text><Text><![CDATA[World]]></Text>"
Output I want : <text>Hello</text> 
              <text>World</text>

我想在<text></text>之间获取所有数据,并将其添加到列表中。

我尝试的代码是:

private List<XElement> Foo(string input)
{
    string pattern = "<text>(.*?)</text>";
    input = "<Text><![CDATA[Hello]]></Text><Text><![CDATA[World]]></Text>" //For Testing
    var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase);
    var a = matches.Cast<Match>().Select(m => m.Groups[1].Value.Trim()).ToArray();

    List<XElement> li = new List<XElement>();
    XElement xText;
    for (int i = 0; i < a.Length; i++)
    {
        xText = new XElement("text");
        xText.Add(System.Net.WebUtility.HtmlDecode(a[i]));
        li.Add(xText);
    }
    return li;
} 

但是,我在这里输出:

<text>&lt;![CDATA[Hello]]&gt;</text>
<text>&lt;![CDATA[World]]&gt;</text>

任何人都可以帮助我。

2 个答案:

答案 0 :(得分:4)

在我看来,你根本不应该使用正则表达式。相反,构造一个有效的XML文档,将其全部包装在根元素中,然后解析它并提取所需的元素。

想要用等效的文本节点替换所有CDATA节点。您可以在将元素提取到列表之前或之后执行此操作,但我之前已选择执行此操作:

using System;
using System.Linq;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        string input = "<Text><![CDATA[Hello]]></Text><Text><![CDATA[World]]></Text>";
        string xml = "<root>" + input + "</root>";
        var doc = XDocument.Parse(xml);
        var nodes = doc.DescendantNodes().OfType<XCData>().ToList();
        foreach (var node in nodes)
        {
            node.ReplaceWith(new XText(node.Value));
        }
        var elements = doc.Root.Elements().ToList();
        elements.ForEach(Console.WriteLine);
    }
}

答案 1 :(得分:0)

我会使用XDocument而不是Regex:

var value = "<root><Text><![CDATA[Hello]]></Text><Text><![CDATA[World]]></Text></root>";
var doc = XDocument.Parse(value);
Console.WriteLine (doc.Root.Elements().ElementAt(0).Value);
Console.WriteLine (doc.Root.Elements().ElementAt(1).Value);

输出继电器:

您好 世界