使用c#提取和修改xml的cdata部分

Bop*_*psi 3 c# xml cdata

我有以下xml

<parent>
    <child>abra</child>
    <child>kadabra</child>
    <child>alakazam</child>
    <![CDATA[ some data here ]]>
</parent>
Run Code Online (Sandbox Code Playgroud)

我想提取cdata部分,我所做的是 - 将数据转换为字符串并使用以下代码将其解压缩

string toText = xmlDoc.OuterXml.Substring(xmlDoc.OuterXml.IndexOf("<![CDATA[") + "<![CDATA[".Length);
toText = toText.Remove(toText.IndexOf("]]>"));
Run Code Online (Sandbox Code Playgroud)

其中xmlDoc是XMLDocument,它包含xml以上

有没有更好的方法呢?

我google了很多,但我得到的是cdata部分的提取,只要它是其父元素的唯一子元素.

最后我想修改cdata部分并修改当前的xml为

<parent>
    <child>abra</child>
    <child>kadabra</child>
    <child>alakazam</child>
    <![CDATA[ modified data here ]]>
</parent>
Run Code Online (Sandbox Code Playgroud)

har*_*r07 6

鉴于这个有效的 XML示例:

<parent>
    <child>1</child>
    <child>2</child>
    <child>3</child>
    <![CDATA[ some data here ]]>
</parent>
Run Code Online (Sandbox Code Playgroud)

由于唯一直接子节点的文本节点是<parent>您想要获取的cdata节,因此您可以通过这种方式选择cdata节并修改其内容:

var cdata = (XmlCDataSection)xmlDoc.SelectSingleNode("/parent/text()");
cdata.InnerText = " modified data here ";
Console.WriteLine(xmlDoc.OuterXml);
Run Code Online (Sandbox Code Playgroud)

另一种可能的方法是使用XDocument替换旧库,XmlDocument:

var doc = XDocument.Load("path_to_your_xml");
var xcdata = doc.DescendantNodes().OfType<XCData>().FirstOrDefault();
xcdata.Value = " modified data here ";
Console.WriteLine(doc.ToString());
Run Code Online (Sandbox Code Playgroud)

输出如下(为便于阅读而格式化):

<parent>
    <child>1</child>
    <child>2</child>
    <child>3</child>
    <![CDATA[ modified data here ]]>
</parent>
Run Code Online (Sandbox Code Playgroud)