【问题标题】:How to deserialise Xml content to string如何将 Xml 内容反序列化为字符串
【发布时间】:2011-02-16 17:00:47
【问题描述】:

我正在使用 XmlSerializer 反序列化配置文件。我希望能够将 Xml 元素的子内容提取到字符串字段中。此子内容可以是 xml 本身。

一个简单的例子:

public class Configuration
{
    [XmlAttribute]
    public string MyAttribute { get; set; }

    [XmlText]
    public string Content { get; set; }
}

我正在尝试解析以下内容:

<Configuration MyAttribute="foo">
    <SomeOtherXml />
</Configuration>

我希望将 Content 属性设置为 "&lt;SomeOtherXml /&gt;",但我似乎无法让它工作。我不想将内容封装在 CDATA 或类似文件中。

这是可能的还是我需要手动处理我的配置文件的解析?

谢谢

【问题讨论】:

  • 你可以使用正则表达式来解析它,但我猜你已经知道了。
  • @Duncan - 你为什么关心 xml 元素的名称。如果需要,您可以简单地将 Content 属性命名为“SomeOtherXml”。
  • @Ramhound - 我不在乎 Xml 元素叫什么 - 我希望 Content 属性的 "&lt;SomeOtherXml /&gt;"
  • 解释原因 - 我想在配置文件中嵌入 XSL 转换,但在编写 XSL 时仍然允许智能感知工作。如果我将 XSL 数据封装在 CDATA 中,那么我将失去智能感知。作为一种解决方法,我手动解析配置文件。
  • 为什么不能使用 XmlElement 类型的 Content 属性?那会解决你的问题。作为string,它将始终被转义。

标签: c# serialization xmlserializer deserialization


【解决方案1】:

可以使用 XmlSerializer,但需要手动解析,所以最终可能不值得。

可能还有其他更好的方法可以做到这一点,但我发现这样做的方法是让您的 Configuration 类实现 IXmlSerializable 接口。

public class Configuration : IXmlSerializable
{
    [XmlAttribute]
    public string MyAttribute { get; set; }

    [XmlText]
    public string Content { get; set; }

    public void ReadXml(XmlReader reader)
    {
        if(reader.NodeType == XmlNodeType.Element &&
           string.Equals("Configuration", reader.Name, StringComparison.OrdinalIgnoreCase))
        {
            MyAttribute = reader["MyAttribute"];
        }

        if(reader.Read() &&
           reader.NodeType == XmlNodeType.Element &&
           string.Equals("SomeOtherXml", reader.Name, StringComparison.OrdinalIgnoreCase))
        {
            Content = reader.ReadOUterXml();  //Content = "<SomeOtherXml />"
        }
    }

    public void WriteXml(XmlWriter writer) { }
    public XmlSchema GetSchema() { }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多