【问题标题】:XML Serialization of HTMLHTML的XML序列化
【发布时间】:2010-12-03 03:39:13
【问题描述】:

好吧,这个成功了!谢谢大家!

public class Result
{
    public String htmlEscaped
    {
        set;
        get;
    }

    [XmlIgnore]
    public String htmlValue
    { set; get; }

    [XmlElement("htmlValue")]
    public XmlCDataSection htmlValueCData
    {
        get
        {
            XmlDocument _dummyDoc = new XmlDocument();
            return _dummyDoc.CreateCDataSection(htmlValue);
        }
        set { htmlValue = (value != null) ? value.Data : null; }
    }
}

    Result r = new Result();
    r.htmlValue = ("<b>Hello</b>");
    r.htmlEscaped = ("<b>Hello</b>");
    XmlSerializer xml = new XmlSerializer(r.GetType());
    TextWriter file = new StreamWriter(Environment.CurrentDirectory + "\\results\\result.xml", false, System.Text.Encoding.Default);
    xml.Serialize(file, r);
    file.Close();

结果:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlEscaped>&lt;b&gt;Hello&lt;/b&gt;</htmlEscaped>
  <htmlValue><![CDATA[<b>Hello</b>]]></htmlValue>
</Result>

如您所见,在 CDATA 为返回类型后,文件系统上的 XML 文件中不再有转义 html。 JSON 序列化不再起作用,但这可以通过一点类型扩展来解决。


问题是:

也许有人知道怎么做……

我有这个课程:

public class Result
{
    public String htmlValue
    {
        get;
        set;
    }
}

我用它把它序列化为 XML

Result res = new Result();
res.htmlValue = "<p>Hello World</p>";
XmlSerializer s = new XmlSerializer(res.GetType());
TextWriter w = new StreamWriter(Environment.CurrentDirectory + "\\result.xml", false, System.Text.Encoding.Default);
s.Serialize(w, res);
w.Close();

工作正常,我明白了:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlValue>&lt;b&gt;Hello World&lt;/b&gt;</htmlValue>
</Result>

为了得到这个,我可以做些什么改变:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlValue><![CDATA[<b>Hello World</b>]]></htmlValue>
</Result>

我已经搜索过,但找不到任何东西。 htmlValue 的类型 必须保留字符串,因为其他序列化 JSON 等。

棘手的一个...提前感谢您的建议

  • HTML 在 C# 中的字符串中是正确的。为什么要解码或编码?
  • XmlSerializer 将转义的 HTML 保存为 XML 文件。
  • 不要使用 C# 进行消费。

是接受这个的外部工具:

<htmlValue><![CDATA[<b>Hello World</b>]]></htmlValue>

但不是

<htmlValue>&lt;b&gt;Hello World&lt;/b&gt;</htmlValue>

我对 JSON Serializer 做同样的事情,在硬盘驱动器上的文件中,HTML 被正确保存。 为什么以及在哪里使用 HTTP 实用程序来防止这种情况?以及如何获取&lt;![CDATA[ ]]&gt;

你能提供一个代码示例吗? 除了 C# 自己的序列化器之外,还有其他序列化器吗?

我从 Marco André Silva 那里找到了这个链接 .NET XML Serialization of CDATA ATTRIBUTE ,我需要这样做,但不同的是,如何在不更改类型的情况下包含它?

【问题讨论】:

  • 你为什么在乎?两者在语义上是相同的。
  • 当然是使用它的工具,不喜欢它。首先它显示 HTML 文本。在 2 日,它以粗体显示“Hello World”。我无法更改消费工具。
  • 那么该工具还有其他问题,因为您没有&lt;b&gt;Hello World&lt;/b&gt;,所以它不应该是粗体。
  • John "如果该工具接受 CDATA 版本但不接受转义版本,则该工具存在需要修复的致命错误。两者是语义相同的 XML。可能该工具不理解 XML ?除此之外,我不明白你的问题。另外,C# 是一种编程语言。它根本没有任何序列化程序。你似乎指的是 .NET 序列化程序,而你恰好在 C# 编程中使用它们语言。”是的,但是为什么在 XML 标准上还有一个 CDATA 标记?如果有另一种方法可以在 C# 中从类中创建 XML 文件。打开任何解决方案。
  • ups...

    应该是 ,有问题已修复。在创建示例时发生,问题仍然相同。消费工具无法改变它的生产力和公司让它消失了!

标签: c# html xml-serialization cdata


【解决方案1】:

请参阅“CDATA serialization with XMLSerializer”了解相同的问题和解决方案。

顺便说一句,在我看来,如果供应商不再存在,是时候使用不同的产品了。可能了解仅存在十多年的 XML 规范。

【讨论】:

  • 反映类型时出错。 [XmlElement("node", typeof(XmlCDataSection))] public string htmlValue { get;放; } 由于 JSON 序列化器,返回需要是字符串。
  • 我认为您需要发布一些代码。首先是 XML 序列化,现在是 JSON 序列化。我不明白你要解决什么问题。
  • 我已经在使用 JsonExSerializer,它可以很好地完成工作。我还需要 XML。对象 > XML
  • 我不明白你要做什么?这就是为什么我希望你发布一些代码来展示你正在尝试做的事情。
【解决方案2】:

据我了解,您需要 XML 将其提供给某个实用程序。您是否还打算使用它来反序列化对象?

如果不是,那为什么不自己做——序列化你的对象呢?往返对象 -> XML -> 对象有点棘手,但第一部分不是。

【讨论】:

    【解决方案3】:

    这里有一个简单的技巧来实现你想要的。您只需要序列化 ​​XmlCDataSection 属性而不是字符串属性:

    (和John的建议差不多,但是简单一点……)

    public class Result
    {
        [XmlIgnore]
        public String htmlValue
        {
            get;
            set;
        }
    
        private static XmlDocument _dummyDoc;
    
        [XmlElement("htmlValue")]
        public XmlCDataSection htmlValueCData
        {
            get { return _dummyDoc.CreateCDataSection(htmlValue); }
            set { htmlValue = (value != null) ? value.Data : null; }
        }
    }
    

    【讨论】:

    • 我的“建议”来自 OP 需要 CDATA 作为文本值的情况。
    • 出来是空的,只有 XML Header。也许 htmlValue 上的 [XmlIgnore] 会影响 [XmlElement("htmlValue")]。你试过了吗?
    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多