Как написать 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.