2017-04-25 65 views
1

我有類下面的示例結構:添加固定屬性的XmlElement沒有包裝類

public class DataClass{ 

    public String Field1{ get; set; } 
    public Int32 Field2{ get; set; } 
    public Int32 Field3{ get; set; } 

} 

我要補充一個固定的屬性,每一個領域,從而使輸出看起來像:

<DataClass> 
    <Field1 code="code#1">Value of Field1</Field1> 
    <Field2 code="code#2">Value of Field2</Field2> 
    <Field3 code="code#3">Value of Field3</Field3> 
</DataClass> 

這可能沒有爲每個字段編寫包裝類? 喜歡的東西:

public class DataClass{ 

    [XmlElement(FixedAttribute="code#1")] 
    public String Field1{ get; set; } 

    [XmlElement(FixedAttribute="code#2")] 
    public Int32 Field2{ get; set; } 

    [XmlElement(FixedAttribute="code#3")] 
    public Int32 Field3{ get; set; } 

} 

親切的問候

回答

1

不,XML屬性不提供這樣的功能,使用內置的序列化。一種選擇是使DataClass實施IXmlSerializable。這使您可以完全控制輸出XML。你必須自己序列化所有的屬性,但是由於你必須爲每個屬性提供代碼屬性,所以它並沒有那麼糟糕。如果您有很多DataClass es,您可能會考慮創建一個自定義屬性來裝飾屬性,並將序列化邏輯移動到基類中,或者如果所有DataClass es的公共基類不方便,則將其放入單獨的助手類中。然後IXmlSerializable.WriteXml會調用這個自定義邏輯。如果您控制DataClass es,我認爲這是更好的選擇。

更哈克替代方法是創建DataClass,將委託包裹DataClass對象到正規的XML序列化的序列化的包裝,但是要替換一個自定義XmlWriter這會增加你的XML屬性對應的屬性的XML元素。

+0

謝謝你的解釋和提示。我會寫我自己的序列化程序。 – Mario

1

您可以編寫自定義序列,而不是使用XML的LINQ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication49 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      XElement dataClass = new XElement("DataClass"); 

      for(int i = 1; i <= 3; i++) 
      { 
       XElement field = new XElement("Field" + i.ToString(), new object[] { 
        new XAttribute("code", "code#" + i.ToString()), 
        "Value of Field" + i.ToString() 
       }); 
       dataClass.Add(field); 
      } 

     } 
    } 
} 
0

您可以使用自定義XML作家:

public class DataClassWriter : XmlTextWriter 
{ 
    public DataClassWriter(string url) : base(url, Encoding.UTF8) { } 

    public override void WriteStartElement(string prefix, string localName, string ns) 
    { 
     if (localName.StartsWith("Field")) 
     { 
      base.WriteStartElement(prefix, localName, ns); 
      base.WriteAttributeString("code", "code#" + localName.Substring(5)); 
     } 
     else 
      base.WriteStartElement(prefix, localName, ns); 
    } 
} 

使用:

var xs = new XmlSerializer(typeof(DataClass)); 

using (var writer = new DataClassWriter("out.xml")) 
    xs.Serialize(writer, data);