【问题标题】:Language identification for xml tags while using built-in xml serialization mechanisms使用内置 xml 序列化机制时 xml 标记的语言识别
【发布时间】:2011-04-07 18:10:03
【问题描述】:

假设,我有一个简单的类型:

public class Report
{
    public Report()
    {
        BirthDate = new Element();
        BirthPlace = new Element();
    }

    public Element BirthDate { get; set; }
    public Element BirthPlace { get; set; }
}

public class Element
{
    [XmlAttribute("published")]
    public bool Published { get; set; }
    [XmlText]
    public string Value { get; set; }
}

我为序列化目的定义了简单的扩展方法:

public static class TheHelper
{
    public static string Serialize<T>(this T source, Encoding encoding)
    {
        MemoryStream memoryStream = new MemoryStream();
        XmlSerializer xs = new XmlSerializer(typeof(T));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, encoding);

        xs.Serialize(xmlTextWriter, source);
        memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
        return encoding.GetString(memoryStream.ToArray());
    }
}

当示例 Report 对象创建后,接下来将其序列化为 xml 格式:

Report r = new Report();
r.BirthDate.Published = true;
r.BirthDate.Value = DateTime.Now.AddYears(-1000).ToString("yyyy-MM-dd");
r.BirthPlace.Published = false;
r.BirthPlace.Value = "K-PAX";

string xml = r.Serialize(Encoding.UTF8);

如下所示的输出文档已创建:

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <BirthDate published="true">1011-04-07</BirthDate>
    <BirthPlace published="false">K-PAX</BirthPlace>
</Report>

但我想使用名为 xml:lang 的特殊属性添加 language identification

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <BirthDate published="true" xml:lang="en-GB">1011-04-07</BirthDate>
    <BirthDate published="true" xml:lang="kp-AX">07.04.1011</BirthDate>
    <BirthPlace published="false" xml:lang="en-GB">K-PAX</BirthPlace>
    <BirthPlace published="false" xml:lang="kp-AX">k_p4x</BirthPlace>
</Report>

实现这一目标的聪明方法是什么?我为 en-GB 和 kp-AX.. 语言定义了资源。如何使用 XmlSerializer 修改和创建 Report 对象以使具有不同 xml-lang 属性的多个标签可序列化?

问候。

【问题讨论】:

  • 你不应该使用new XmlTextWriter()。自 .NET 2.0 以来,它已被弃用。你应该改用XmlWriter.Create()

标签: c# .net localization xml-serialization


【解决方案1】:

这应该可行:

public class Element
{
    [XmlAttribute("published")]
    public bool Published { get; set; }
    [XmlAttribute("xml:lang", DataType = "language")]
    public string Language { get; set; }
    [XmlText]
    public string Value { get; set; }
}

如果您想使用CultureInfo 类,您可以创建一个属性并在CultureInfo 属性上使用XmlIgnore 属性,并添加一个转换它的字符串属性,就像在这个LocalizableString 示例中一样:

/// <summary>
/// The language of the <see cref="Value"/>
/// </summary>
[XmlIgnore]
public CultureInfo Language { get; set; }

/// <summary>Used for XML serialization.</summary>
/// <seealso cref="Language"/>
[XmlAttribute("xml:lang", DataType = "language")]
public string LanguageString
{
    get { return (Language == null || string.IsNullOrEmpty(Language.ToString())) ?
             null : Language.ToString(); }
    set { Language = string.IsNullOrEmpty(value) ?
             CultureInfo.InvariantCulture : new CultureInfo(value); }
}

【讨论】:

  • 你试过了吗?在属性名称中包含前缀是否有效?
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多