2015-03-19 67 views
3

我有以下XML提取和使用C#

<parent> 
    <child>abra</child> 
    <child>kadabra</child> 
    <child>alakazam</child> 
    <![CDATA[ some data here ]]> 
</parent> 

我想提取CDATA部分,我所做的是修改XML的CDATA部分 - 转换的数据转换成字符串,用下面的代码中提取它

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

其中xmlDoc中,是为XMLDocument这contails上面的XML

是否有这样做的没有更好的办法?

我google了很多,但是我得到的仅仅是cdata部分的提取,只有它的父元素的唯一的孩子。

最后我想修改CDATA节和修改当前XML作为

<parent> 
    <child>abra</child> 
    <child>kadabra</child> 
    <child>alakazam</child> 
    <![CDATA[ modified data here ]]> 
</parent> 

回答

5

鉴于这种有效 XML示例:

<parent> 
    <child>1</child> 
    <child>2</child> 
    <child>3</child> 
    <![CDATA[ some data here ]]> 
</parent> 

自认为是<parent>直接孩子唯一的文本节点是您想要获得的cdata部分,您可以通过这种方式选择cdata部分并修改其内容:

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

另一种可能的方法是使用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()); 

输出为如下(格式化的可读性):

<parent> 
    <child>1</child> 
    <child>2</child> 
    <child>3</child> 
    <![CDATA[ modified data here ]]> 
</parent> 
+0

非常感谢har07。有效。它帮助我理解了很多。 :) – Bopsi 2015-03-19 07:01:56

+0

很高兴帮助:) – har07 2015-03-20 07:56:03