我得到一个包含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><![CDATA[Hello]]></text>
<text><![CDATA[World]]></text>
任何人都可以帮助我。
答案 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);
输出继电器:
您好 世界