繁体   English   中英

从输入中删除CDATA

[英]Remove CDATA from the input

我得到一个包含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>

谁能帮我。

在我看来,您根本不应该使用正则表达式。 而是构造一个有效的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);
    }
}

我将使用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);

输出:

你好,世界

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM