将文本节点插入包含XML的XML文档

时间:2009-06-04 07:45:44

标签: c# xml

我正在动态构建XML文档,我在其中使用CreateTextNode( text )方法创建文本节点。

现在,如果文本包含XML,它将被XML编码。

例如:

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

如何在不进行XML编码的情况下插入文本。

编辑:

我正在使用XmlDocument构建XML文档并插入元素和节点。 最终输出不应包含CDATA部分或编码部分。

对于instace,我希望最终输出看起来像这样,文本来自一个设置:

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

3 个答案:

答案 0 :(得分:7)

如果您希望文字"some <b>bolded</b> text",则编码是正确的事物 - 否则它不是(仅仅)文本节点。你可以CDATA,但我认为这也不是你的意思。

你想要xml内容如上吗?即,它内部有一个<b>...</b> 元素


编辑:这是通过各种方法添加内容的代码:

        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 :(得分:1)

将其插入CDATA部分:

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

答案 2 :(得分:0)

使用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”节点的内容现在实际上是三个节点。