Вставить текстовый узел в документ XML, содержащий XML - PullRequest
3 голосов
/ 04 июня 2009

Я динамически создаю документ XML, где создаю текстовый узел с методом CreateTextNode ( text ).

Теперь, если текст содержит XML, он будет закодирован в формате XML.

Например:

text = "some <b>bolded</b> text"

Как вставить текст без кодирования XML.

РЕДАКТИРОВАТЬ:

Я создаю документ XML с помощью XmlDocument и вставляю элементы и узлы. Окончательный вывод не должен содержать разделы CDATA или закодированные части.

Для instace я хочу, чтобы конечный результат выглядел следующим образом, где текст исходит из параметра:

<root><p>Some <b>bolded</b> text</p></root>

Ответы [ 3 ]

7 голосов
/ 04 июня 2009

Если вы хотите, чтобы text было "some <b>bolded</b> text", тогда кодировка - это правильная вещь, иначе это не просто текстовый узел Вы могли бы CDATA это, но я не думаю, что это то, что вы имеете в виду.

Вы хотите, чтобы содержимое xml было выше? то есть, чтобы внутри него находился <b>...</b> элемент ?


edit: вот код, который добавляет контент различными способами:

        string txt = "some <b>bolded</b> text";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<xml><foo/></xml>");
        XmlElement foo = (XmlElement)doc.SelectSingleNode("//foo");

        // text: <foo>some &lt;b&gt;bolded&lt;/b&gt; text</foo>
        foo.RemoveAll();
        foo.InnerText = txt;
        Console.WriteLine(foo.OuterXml);

        // xml: <foo>some <b>bolded</b> text</foo>
        foo.RemoveAll();
        foo.InnerXml = txt;
        Console.WriteLine(foo.OuterXml);

        // CDATA: <foo><![CDATA[some <b>bolded</b> text]]></foo>
        foo.RemoveAll();
        foo.AppendChild(doc.CreateCDataSection(txt));
        Console.WriteLine(foo.OuterXml);
1 голос
/ 04 июня 2009

Вставьте его в CDATA раздел:

<![CDATA[some <b>bolded</b> text]]>
0 голосов
/ 04 июня 2009

Используйте узел CDATA, например:

class Program {

    static void Main(string[] args) {
        XmlDocument d = new XmlDocument();

        XmlNode root = d.CreateNode(XmlNodeType.Element, "root", null);
        d.AppendChild(root);

        XmlNode cdata = d.CreateNode(XmlNodeType.CDATA, "cdata", null);
        cdata.InnerText = "some <b>bolded</b> text";
        root.AppendChild(cdata);

        PrintDocument(d);
    }

    private static void PrintDocument(XmlDocument d) {
        StringWriter sw = new StringWriter();
        XmlTextWriter textWriter = new XmlTextWriter(sw);
        d.WriteTo(textWriter);
        Console.WriteLine(sw.GetStringBuilder().ToString());
    }
}

Это напечатает

<root><![CDATA[some <b>bolded</b> text]]></root>

Секция CDATA выглядит некрасиво, но именно так вы вставляете текст без экранирования символов ...

В противном случае вы можете использовать свойство InnerXml узла:

    static void Main(string[] args) {
        XmlDocument d = new XmlDocument();

        XmlNode root = d.CreateNode(XmlNodeType.Element, "root", null);
        d.AppendChild(root);

        XmlNode cdata = d.CreateNode(XmlNodeType.Element, "cdata", null);
        cdata.InnerXml = "some <b>bolded</b> text";
        root.AppendChild(cdata);

        PrintDocument(d);
    }

Это печатает

<root><cdata>some <b>bolded</b> text</cdata></root>

Но обратите внимание, когда вы десериализуете его, поскольку содержимое узла "cdata" теперь фактически состоит из трех узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...