簡體   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