Как написать CData в xml
У меня есть xml like:
<?xml version="1.0" encoding="UTF-8"?>
<entry>
<entry_id></entry_id>
<entry_status></entry_status>
</entry>
Я пишу данные в нем, например:
XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status");
xnode.InnerText = "<![CDATA[ " + Convert.ToString(sqlReader["story_status"]) + " ]]>" ;
но его изменение "<" к "& lt" CDATA.
Скажите, пожалуйста, как заполнять значения выше xml в формате CData.
Я знаю, что мы можем создать CDATA, например:
XmlNode itemDescription = doc.CreateElement("description");
XmlCDataSection cdata = doc.CreateCDataSection("<P>hello world</P>");
itemDescription.AppendChild(cdata);
item.AppendChild(itemDescription);
но мой процесс состоит в том, чтобы прочитать node xml и изменить его значение, чтобы не добавлять в него.
Благодаря
Ответы
Ответ 1
Вам действительно нужно, чтобы это было в CDATA, или просто хотите получить текст там, который не потребует дополнительного экранирования в вашем коде?
InnerText
выполняет любое ускорение, поэтому обычно я просто использую
xnode.InnerText = Convert.ToString(sqlReader["story_status"]);
... но если вы действительно хотите CDATA node, вы можете создать его самостоятельно в соответствии с ответом Nekresh.
Ответ 2
Как описано здесь: msdn
// Create an XmlCDataSection from your document
var cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"]));
// Append the cdata section to your node
xnode.AppendChild(cdata);
Ответ 3
Если вам действительно нужен раздел CDATA (см. Jon answer), вы можете добиться этого так:
XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status");
XmlCDataSection cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"]));
xnode.InnerXml = cdata.OuterXml;
Это заменит содержимое xnode
, а не добавит его.
Ответ 4
XmlNode childNode = node.ChildNodes[0];
if (childNode is XmlCDataSection)
{
XmlCDataSection cdataSection = childNode as XmlCDataSection;
cdataSection.Value = newValue;
}
Ответ 5
Используйте Node.InnerXml, а не Node.InnerText. Node.InnerText автоматически заменяет специальные значения. Обратите внимание: если вы укажете CDATA в InnerXml, то Node.InnerText - это текст в формате CDATA.
Пример:
public class Test
{
public static int Main(string[] args)
{
const string xmlTxt = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<entry>
<entry_id></entry_id>
<entry_status></entry_status>
</entry>";
TextReader treader = new StringReader(xmlTxt);
XmlReader xreader = XmlReader.Create(treader);
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xreader);
XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status");
//xnode.InnerText = "<![CDATA[something]]>";
xnode.InnerXml = "<![CDATA[something]]>";
Console.WriteLine("inner text is: " + xnode.InnerText);
xdoc.Save(Console.Out); Console.WriteLine();
return 0;
}
}
Выход программы:
inner text is: something
<?xml version="1.0" encoding="ibm852"?>
<entry>
<entry_id>
</entry_id>
<entry_status><![CDATA[something]]></entry_status>
</entry>
Ответ 6
Вы можете использовать writer.WriteCData(value);
где автор - объект XmlWriter
.