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

问题描述:

我正在使用CreateTextNode(text)方法创建文本节点,从而动态构建XML文档。将文本节点插入到包含XML的XML文档中

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

例如:

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

你怎么插入而不被XML编码的文本。

编辑:

我建立一个XML文档与XmlDocument的,插入单元和节点。 最终输出不应该包含CDATA部分或编码部分。

对于instace我想最终的输出看起来是这样,这里的文字来自于一个设置:

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

你使用什么模型? XmlDocument的?的XDocument?什么? – 2009-06-04 07:48:47

+0

(回复评论) – 2009-06-04 08:00:58

+0

为什么你不想编码? – AnthonyWJones 2009-06-04 08:01:40

如果你想在文字"some <b>bolded</b> text",然后编码是权利事情 - 否则它不是(只)文本节点。你可以CDATA它,但我不认为这就是你的意思。

你想要的XML内容是上述?即它在里面得到一个<b>...</b>elelment


编辑:这里的,增加了通过各种方法的内容代码:

 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); 
+0

文本来自一个设置,它必须以文本或XML格式插入。最终的XML不应该包含CDATA部分。 – Drejc 2009-06-04 07:56:12

+0

然后我希望你想要InnerXml以上... – 2009-06-04 08:00:50

+0

外部和内部的Xml做的伎俩,我认为它会工作的额外的逻辑。 – Drejc 2009-06-04 08:20:18

将它插入CDATA部分:

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

使用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部分看起来很丑陋,但这是好事W使您插入文本,而不必转义字符...

否则,你可以使用一个节点的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”节点的内容现在实际上是三个节点。