C# 通过linqToXml读取标记内的cdata和html

C# 通过linqToXml读取标记内的cdata和html,c#,html,xml,linq,C#,Html,Xml,Linq,我想摆脱CDATA,我想阅读br标签。 这是我的xml: <body> <![CDATA[ Apple iPhone är mycket mer än en mobil. Den är en kombination av tre enheter: en revolutionerande mobiltelefon, en iPod i widescreenformat och en banbrytande Internetenhet. Allt detta och

我想摆脱CDATA,我想阅读br标签。 这是我的xml:

<body>
<![CDATA[
Apple iPhone är mycket mer än en mobil. Den är en kombination av tre enheter: en       revolutionerande mobiltelefon, en iPod i widescreenformat och en banbrytande Internetenhet.  Allt detta och mer därtill gör den till den bästa mobiltelefon du kan föreställa dig.
]]>
<br/>
<![CDATA[
Med de maskinvarufunktionerna i iPhone i kombination med världens mest avancerade   mobiloperativsystem öppnar Apple möjligheter för vad en mobiltelefon kan göra. Programmen   är helt integrerade med varandra och kan synkroniseras med din dator - oavsett om du   använder Mac eller PC. Från Multi-Touch-skärmen till det smarta tangentbordet och   sensorerna.
]]>
<br/>
</body>



这是我的代码:

 public static List<string> GetDescriptionXml(string idItem)
    {
        Dictionary<string, string> dic = new Dictionary<string, string>();
        XDocument xdoc = XDocument.Load(GetDescription(idItem));
        return (from doc in xdoc.Elements("body") select doc.Value).ToList();
    }
公共静态列表GetDescriptionXml(字符串idItem) { Dictionary dic=新字典(); XDocument xdoc=XDocument.Load(GetDescription(idItem)); 返回(从xdoc.Elements(“body”)中的文档选择doc.Value).ToList(); } 当我运行这个时,我只得到CDATA中的值,而没有br标记!
我也可以得到br标签吗?

最终的解决方案取决于HTML可能包含的所有可能的情况。这是一种可能的解决方案:

.....
return (from doc in xdoc.Elements("body")
        select string.Join(Environment.NewLine,
                           doc.Nodes()
                              .Select(o =>
                                      {
                                        if (o is XCData) return ((XCData)o).Value;
                                        else return o.ToString();
                                      }))
        ).ToList();
此解决方案通过换行连接
的所有子节点。对于每个子节点,如果它是一个
CData
节,则该值将用于
String.Join()
操作。否则,如果它是

或除
CData
以外的任何内容,则将获取整个标记


如果您想以不同的方式处理其他子节点类型,您可以轻松地修改
,如果。。。否则…
将根据您的需要进行分割。

doc.value
仅返回xml元素中的内容(文本)
不是一个内容,但它是一个空xml元素(即,它不包含任何内容)。如果您同时需要cdata值和
,您可以使用简单的字符串替换来摆脱
..
]]>
这一极好的解决方案!您能详细说明使用linq与普通字符串替换相比的优势吗?