删除XML的一部分,编辑它,然后将其添加回XML的原始位置
本文关键字:XML 添加 位置 原始 一部分 编辑 删除 然后 | 更新日期: 2023-09-27 17:51:00
所以我最终要做的是解析XML并将元素值添加到包含在cdata节中的元素中。我在xml中搜索cdata部分,将其拉出并将其加载到另一个xdocument中,以便保持xml结构,然后我添加元素值,但现在我不确定如何将其添加回原始xml的原始位置。
原XMl:
<OUTPUT version="2.0"><RESPONSE><DATA state="FL" city="Sarasota">
<![CDATA[<LION xmlns="http://www.com" version="5.050">
<COMMENTS>
<PLACES>
Forest under a tree
</PLACES></COMMENTS></LION>]]>
</DATA></RESPONSE></OUTPUT>
我搜索cdata部分并像这样插入元素值:
XDocument value = XDocument.Parse(returnValue);
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"'<'!'[CDATA'[(?<text>[^']]*)']']'>", options);
bool isMatch = regex.IsMatch(returnValue);
if(isMatch)
{
Match match = regex.Match(returnValue);
string HTMLtext = match.Groups["text"].Value;
XDocument cdata = XDocument.Parse(HTMLtext);
XNamespace ns = @"http://www";
var com = cdata.Descendants(ns + "COMMENTS").First();
var dcomm = com.Element(ns + "PLACES");
dcomm.Value = "test"+ dcomm.Value;
我剩下的是追加回cdata文本,因为它被删除转换正则表达式到字符串,然后把它放回原来的xml中的cdata的位置。
您可以测试查看节点是否为cdata,而不必使用使用NodeType属性的regex。在示例中,我们尝试转换到XCData来测试。
XElement root = XElement.Parse(input);
XElement dataElement = root.Descendants("DATA").FirstOrDefault();
XCData cdata = dataElement == null ? null : dataElement.FirstNode as XCData;
if (cdata == null)
{
return;
}
XElement nestedXml = XElement.Parse(cdata.Value);
XNamespace ns = @"http://www.com";
var com = nestedXml.Descendants(ns + "PLACES").First();
com.Value = "Incomplete App Email sent to member." + com.Value;
cdata.Value = nestedXml.ToString(SaveOptions.DisableFormatting);
string updatedOutput = cdata.ToString();