将XElement转换为HTML字符串。

4

我正在使用Xml和Linq执行XHTML文档上的XML操作。

当将其转换回字符串以输出到浏览器时,创建XElement时渲染脚本标记以其原始提供的形式<script />

这会导致大多数市场上的浏览器无法正确处理它。

我想以这种方式执行XElement到String的转换,使它以这种方式输出脚本标记<script></script>

有人能帮我吗?先感谢您 :)

第一次编辑 提供更多信息,数据来自MSSQL 2008R2数据库中的xml字段。 加载方式为 <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js" />

第二次编辑 工作样例

using System;
using System.Linq;
using System.Xml.Linq;

namespace Test1
{
    class Test1
    {
        static void Main(string[] args)
        {
            XElement element = XElement.Parse("<div><script /><script>Test</script></div>");
            var EmptySet = (from e in element.DescendantsAndSelf()
                           where e.IsEmpty
                           select e);
            foreach(XElement e in EmptySet)
            {
                e.Value = String.Empty;
            }
            Console.WriteLine(element.ToString(SaveOptions.None));
        }
    }
}

以及它的结果。

<div>
  <script></script>
  <script>Test</script>
</div>
2个回答

4

您尝试使用SaveOptions.DisableFormatting了吗?

我实际上无法重现这个问题...您执行了哪些XML操作?您自己创建了script元素吗?以下代码可以正常工作:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XElement element = XElement.Parse("<script></script>");
        // Both of these write <script></script>
        Console.WriteLine(element.ToString(SaveOptions.None));
        Console.WriteLine(element.ToString(SaveOptions.DisableFormatting));
    }
}

(XDocument.SaveXElement.Save具有相同的选项。)

编辑:如果要将没有子节点的元素更改为一个只有单个空文本节点的元素,您可以将element.Value设置为“”。例如:

XElement element = XElement.Parse("<script />");
Console.WriteLine(element.ToString()); // Prints <script />
element.Value = "";
Console.WriteLine(element.ToString()); // Prints <script></script>

不幸的是,XML 是来自数据库的,因此它作为 <script /> 从数据库中获取。当我将其放入您的解析示例中时,它会输出 <script />。 - Michael
@Michael:所以它并不是将 script 标签转换为 <script /> - 它忠实地格式化了来自数据库的 XML。 - Jon Skeet
谢谢你的回答,我已将你标记为答案。 作为一个快速的问题,如果脚本标签是深层次的后代XElement而不是父级,那么最简单的方法是搜索XElements以更改所有空元素,使其像你的示例一样具有空字符串。 - Michael
@Michael:类似 doc.Descendants().Where(x => x.Value == "") 这样的代码应该可以工作。在修改元素之前,您可能需要将查询实例化(转换为列表)。请注意,即使没有子元素,获取 Value 属性也会返回 "" 而不是 null,至少我是这样看的。 - Jon Skeet
谢谢你的帮助Jon :) 我发现在测试IsEmpty时返回它是否为空,所以我已经进行了更正,并使其按照我想要的方式工作。 - Michael
@Michael:哎呀,我没注意到IsEmpty。我个人不会在那里使用查询表达式:var emptySet = element.DescendantsAndSelf().Where(e => e.IsEmpty).ToList(); - Jon Skeet

0

使用

XElement.Save(XmlWriter writer)

当作为XmlWriter的输出时,使用StringWriter是一种快速可靠的方式来获得你想要的内容。


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