gpt4 book ai didi

c# - 从输入中删除 CDATA

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:44 33 4
gpt4 key购买 nike

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

关于c# - 从输入中删除 CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35897174/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com