2011-04-07 51 views
2

想,我有一个简单类型:语言识别为XML标记,而使用内置的XML序列化机制

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()); 
    } 
} 

当样本报告对象被创建,它被下一个序列化为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); 

输出文件如下所示i Š创建:

<?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特殊属性添加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 ..语言定义的资源。如何修改和创建Report对象以使具有不同xml-lang属性的多个标记可以使用XmlSerializer进行序列化?

问候。

+1

您不应该使用'new XmlTextWriter()'。从.NET 2.0开始已经被弃用了。您应该改用'XmlWriter.Create()'。 – 2011-04-07 19:11:49

+0

感谢您的线索。 – jwaliszko 2011-04-09 10:42:00

回答

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类,你可以创建一个属性,使用XmlIgnore属性上CultureInfo财产,有一个转换它,就像在一个除了字符串属性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); } 
} 
+0

你试过这个吗?它是否可以在属性名称中包含前缀? – 2011-04-07 19:11:10

+0

是的,前缀是好的。 – jwaliszko 2011-04-09 10:42:46