繁体   English   中英

XML问题 - 正在删除节点中的HTML(ASP.NET C#LINQ to XML)

[英]XML problem - HTML within a node is being removed (ASP.NET C# LINQ to XML)

当我加载此XML节点时,节点中的HTML将被完全删除。

这是我用来获取节点内的值的代码,它是与HTML结合的文本:

var stuff = innerXml.Descendants("root").Elements("details").FirstOrDefault().Value;

在“详细信息”节点内部是如下所示的文本:

"This is <strong>test copy</strong>. This is <a href="#">A Link</a>"

当我查看“stuff”var时,我看到了这个:

"This is test copy. This is A Link". There is no HTML in the output... it is pulled out.

也许Value应该是innerXml或innerHtml? FirstOrDefault()与此有什么关系吗?

我认为xml不需要“cdata”块...

HEre是一个更完整的代码片段:

 announcements =
                from link in xdoc.Descendants(textContainer).Elements(textElement)
                where link.Parent.Attribute("id").Value == Announcement.NodeId
                select new AnnouncmentXml
                {
                    NodeId = link.Attribute("id").Value,
                    InnerXml = link.Value
                };

XDocument innerXml;
innerXml = XDocument.Parse(item.InnerXml);
var abstract = innerXml.Descendants("root").Elements("abstract").FirstOrDefault().Value;

最后,这是一个Xml节点的片段。 注意标准xml结构中有“InnerXml”。 它始于。 我称之为“InnerXml”,这就是我传递给名为InnerXml的XDocument:

 <text id="T_403080"><root> <title>How do I do stuff?</title> <details> Look Here <a href="http://" target=" _blank">Some Form</a>. Please note that lorem ipsum dlor sit amet.</details> </root></text> 

[UPDATE]

我尝试使用这个帮助器lamda,它将返回HTML但它被转义,所以当它显示在页面上时,我在视图中看到实际的HTML(它显示而不是给出一个链接,标签被打印到屏幕:

Title = innerXml.Descendants("root").Elements("title").FirstOrDefault().Nodes().Aggregate(new System.Text.StringBuilder(), (sb, node) => sb.Append(node.ToString()), sb => sb.ToString());

所以我尝试了HTMLEncode和HTMLDecode,但都没有帮助。 一个人在屏幕上显示逃脱的字符,另一个没有做任何事:

Title = 
                        System.Web.HttpContext.Current.Server.HtmlDecode(
                            innerXml.Descendants("root").Elements("details").Nodes().Aggregate(new System.Text.StringBuilder(), (sb, node) => sb.Append(node.ToString()), sb => sb.ToString())
                        );

我认为将您的详细信息节点包装在cdata块中是正确的决定。 CData基本上表示其中包含的信息应被视为文本,而不是针对XML特殊字符进行解析。 详细信息节点中的html字符,尤其是<和>与XML规范直接冲突,应该真正标记为文本。

您可以通过抓取innerXml来解决这个问题,但是如果您可以控制文档内容,那么cdata是正确的决定。

如果你需要一个如何看的例子,这里是详细节点的修改版本:

<details>
    <![CDATA[
         This is <strong>test copy</strong>. This is <a href="#">A Link</a>
    ]]>
</details>

我最终使用的是XmlDocument而不是XDocument。 LINQ to XML似乎不够成熟,无法支持我想要做的事情。 这不是XDoc的InnerXml属性,只有Value。

也许有一天我将能够恢复到LINQ。 现在,我只是不得不把它从我的盘子里拿下来。 这是我的解决方案:

// XmlDoc to hold custom Xml within each node
        XmlDocument innerXml = new XmlDocument();
        try
        {
            // Parse inner xml of each item and create objects
            foreach (var faq in faqs)
            {
                innerXml.LoadXml(faq.InnerXml);

                FAQ oFaq = new FAQ();

                #region Fields
                // Get Title value if node exists and is not null
                if (innerXml.SelectSingleNode("root/title") != null)
                {
                    oFaq.Title = innerXml.SelectSingleNode("root/title").InnerXml;
                }

                // Get Details value if node exists and is not null
                if (innerXml.SelectSingleNode("root/details") != null)
                {
                    oFaq.Description = innerXml.SelectSingleNode("root/details").InnerXml;
                }
                #endregion

                result.Add(oFaq);
            }
        }
        catch (Exception ex)
        {
            // Handle Exception
        } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM