C# 将所有xml节点设置为CDATA
我有一个具有以下结构的xml:C# 将所有xml节点设置为CDATA,c#,xml,cdata,C#,Xml,Cdata,我有一个具有以下结构的xml: <rootNode> <category name="test1"> <string name="n1">n1</string> <string name="n2"><![CDATA[n2]]></string> <string name="n3"><<n3</string> </category&g
<rootNode>
<category name="test1">
<string name="n1">n1</string>
<string name="n2"><![CDATA[n2]]></string>
<string name="n3"><<n3</string>
</category>
<category name="test2">
<string name="n111">n111</string>
<string name="n2"><![CDATA[<<n2]]></string>
<string name="n3 &">
<![CDATA[n3
multiline]]>
</string>
</category>
private void AddCData(字符串路径){
XmlDocument doc=新的XmlDocument();
单据加载(路径);
XmlNode root=doc.DocumentElement;
foreach(根目录中的XmlNode-childNode.SelectNodes(“/rootNode/category/string”)){
AddCData(childNode);
}
保存文档(路径+“_output.xml”);
}
私有void AddCData(XmlNode节点){
字符串innerText=node.innerText;
如果(!string.IsNullOrEmpty(innerText)){
如果(!innerText.StartsWith(“),您可以尝试以下方法:
var doc = new XmlDocument();
doc.Load("path_to_xml_file.xml");
var elements = doc.DocumentElement.SelectNodes("/rootNode/category/string");
foreach (XmlNode element in elements)
{
//check if content of <string> is not CData section
if(!(element.FirstChild is XmlCDataSection))
{
XmlCDataSection cdata = doc.CreateCDataSection(element.InnerText);
//replace inner text with CData section
element.ReplaceChild(cdata, element.FirstChild);
}
}
doc.Save("path_to_xml_file.xml");
var doc=new XmlDocument();
Load(“path_to_xml_file.xml”);
var elements=doc.DocumentElement.SelectNodes(“/rootNode/category/string”);
foreach(元素中的XmlNode元素)
{
//检查的内容是否不是CData节
如果(!(element.FirstChild是XMLCDATA节))
{
XMLCDATA节cdata=doc.createCDATA节(element.InnerText);
//用CData节替换内部文本
element.ReplaceChild(cdata,element.FirstChild);
}
}
doc.Save(“path_to_xml_file.xml”);
您尝试了什么?您使用的解析器是什么?在尝试更改InnerText时,我使用了XmlDocument(问题是输出xml有![CDATA[n1]])。还尝试了System.IO.File.ReadAllText+String.Replace(问题是多行CDATA),“在需要保持不变的现有CDATA中,”&;“在需要保持不变的属性名称中)如果您有更多信息,请编辑您的问题。包括您迄今为止使用的代码。经过进一步挖掘,我通过清除InnerText并添加一个新的CData部分解决了这个问题。用答案回答下面的问题。无论如何,谢谢,gunr2171!这是一个很好的例子,说明了为什么您不应该在不注意X的情况下尝试在XML上执行任意搜索替换ML规格和内容。
private void AddCData(string path) {
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNode root = doc.DocumentElement;
foreach (XmlNode childNode in root.SelectNodes("/rootNode/category/string")) {
AddCData(childNode);
}
doc.Save(path + "_output.xml");
}
private void AddCData(XmlNode node) {
string innerText = node.InnerText;
if (!string.IsNullOrEmpty(innerText)) {
if (!innerText.StartsWith("<![CDATA[")) {
var newCDATA = node.OwnerDocument.CreateCDataSection(innerText);
node.InnerText = "";
node.AppendChild(newCDATA);
}
}
}
var doc = new XmlDocument();
doc.Load("path_to_xml_file.xml");
var elements = doc.DocumentElement.SelectNodes("/rootNode/category/string");
foreach (XmlNode element in elements)
{
//check if content of <string> is not CData section
if(!(element.FirstChild is XmlCDataSection))
{
XmlCDataSection cdata = doc.CreateCDataSection(element.InnerText);
//replace inner text with CData section
element.ReplaceChild(cdata, element.FirstChild);
}
}
doc.Save("path_to_xml_file.xml");