2010-11-11 139 views
7

我有一個自定義對象,它有一個名爲'名稱'的字符串屬性我想保留通過序列化生成的XML相同,但添加屬性到名爲'NiceName'的元素與值'全名'。將Xml屬性添加到字符串屬性

這是我目前:

<TheObject> 
    <Name>mr nobody</Name> 
</TheObject> 

這是我想什麼來產生:

<TheObject> 
    <Name NiceName='Full name'>mr nobody</Name> 
</TheObject> 

我只需要這一段XSLT,所以我不想改變如果可能的話,班級工作方式。 I.E.將名稱從字符串更改爲自定義類。所有對象將具有相同的屬性,它永遠不會改變,它將被完全讀取。

回答

4

如果你定義另一種類型,如下是可能的:

public class Person 
{ 

    private string _name; 


    [XmlIgnore] 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      ThePersonName = new PersonName() 
           { 
            Name = FullName, 
            NiceName = _name 
           }; 
     } 
    } 

    [XmlElement(ElementName = "Name")] 
    public PersonName ThePersonName { get; set; } 

    public string FullName { get; set; } 

} 

public class PersonName 
{ 
    [XmlAttribute] 
    public string NiceName { get; set; } 

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

使用

 XmlSerializer s = new XmlSerializer(typeof(Person)); 
     Person ali = new Person(); 
     ali.FullName = "Ali Kheyrollahi"; 
     ali.Name = "Nobody"; 
     s.Serialize(new FileStream("ali.xml",FileMode.Create), ali); 

會產生

<?xml version="1.0"?> 
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Name NiceName="Nobody">Ali Kheyrollahi</Name> 
    <FullName>Ali Kheyrollahi</FullName> 
</Person> 
+0

感謝您的答案卻是我想要做的是代碼不是爲節點名稱的替代人名。我知道它可能更好地寫入xslt它只是我想從.net而不是xslt管理它。我的意思是我需要生成像 Joe博士在我的Xslt中,我會輸出每個元素的nicename和值,以產生更好的用戶界面。像「全名=先生喬博客」而不是「全名=喬博客」或替代是<電話nicename =「電話」> 1234 – Jammy 2010-11-11 13:23:42

+0

我無法弄清楚如何將兄弟關卡級別屬性應用於另一個屬性作爲屬性。我認爲Aliostad的答案「似乎」有點混亂,但我認爲這是一條路。 – hunter 2010-11-11 13:37:23

+0

你最好在xslt,srsly中這樣做。 'XmlSerializer'不能處理這種扭曲。 – 2010-11-11 13:57:39

7

您可以使用XMLAttribute和XMLTEXT的組合()

採取例如類的聲明如下:

public class Description { 
    private int attribute_id; 
    private string element_text; 

    [XmlAttribute("id")] 
    public int Id { 
     get { return attribute_id; } 
     set { attribute_id = value; } 
    } 

    [XmlText()] 
    public string Text { 
     get { return element_text; } 
     set { element_text = value; } 
    } 
} 

輸出將是

<XmlDocRoot> 
<Description id="1">text</Description>