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

3
我是一名有帮助的助手,以下是您需要翻译的内容:

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

现在,如果text包含XML,则会进行XML编码。

例如:

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

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

编辑:

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

例如,我希望最终输出看起来像这样,其中文本来自设置:

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

你使用的是哪个模型?XmlDocument?XDocument?还是其他的? - Marc Gravell
为什么你不想要它被编码? - AnthonyWJones
3个回答

7
如果您想要“文本”变成“一些粗体文本”,那么编码是正确的选择,否则它不是(只是)一个文本节点。您可以使用CDATA,但我认为这也不是您的意思。
您是否希望XML内容是上述文本(以便在其中获得一个“...”元素)?
以下是通过各种方法添加内容的代码:
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);

该文本来自设置,必须作为文本或XML插入。最终的XML不应包含CDATA部分。 - Drejc
外部和内部的Xml就可以解决问题了,加上额外的逻辑我认为它会工作。 - Drejc

2

将其插入到CDATA部分中:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接