2010-11-11 41 views
7

Tôi có đối tượng tùy chỉnh có thuộc tính chuỗi được gọi là 'Tên' Tôi muốn giữ XML được tạo theo tuần tự giống nhau nhưng thêm thuộc tính vào phần tử được gọi là 'NiceName' với giá trị của 'Tên đầy đủ'.Thêm thuộc tính Xml vào thuộc tính chuỗi

Đây là những gì tôi hiện đang có:

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

Đây là những gì tôi muốn tạo ra:

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

tôi chỉ cần điều này đối với một số XSLT vì vậy tôi không muốn thay đổi cách lớp học hoạt động nếu có thể. I E. Thay đổi tên từ chuỗi thành một lớp tùy chỉnh. Tất cả các đối tượng sẽ có cùng thuộc tính nó sẽ không bao giờ thay đổi nó sẽ hoàn toàn chỉ đọc.

Trả lời

4

Có thể nếu bạn định nghĩa một kiểu khác như sau:

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

Sử dụng

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

sẽ tạo

<?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

Cảm ơn câu trả lời tuy nhiên những gì tôi đang cố gắng để làm là viết mã một sự thay thế cho tên nút không tên người. Tôi biết nó có lẽ tốt hơn để viết này vào xslt của nó chỉ là tôi muốn quản lý nó từ .net thay vì sau đó là xslt. Những gì tôi có nghĩa là tôi cần phải tạo ra một cái gì đó như Ông Joe Blog Trong Xslt của tôi tôi sau đó sẽ chỉ xuất ra tên cho mỗi phần tử và giá trị để tạo ra một giao diện người dùng đẹp hơn nhiều. như "Tên đầy đủ = Ông Joe Blogs" thay vì "FullName = Joe Blogs" hoặc thay thế là 1234 Jammy

+0

Tôi không thể tìm ra cách áp dụng thuộc tính cấp độ anh chị em cho một thuộc tính khác như một thuộc tính. Tôi nghĩ câu trả lời của Aliostad "có vẻ" hơi lộn xộn nhưng tôi nghĩ đó là cách để đi. – hunter

+0

Bạn nên làm điều này trong xslt, srsly. 'XmlSerializer' không thể xử lý loại mâu thuẫn này. –

7

Bạn có thể sử dụng một sự kết hợp của XmlAttribute và XmlText()

mất bên dưới ví dụ về khai báo lớp:

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

Sản lượng sẽ

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

Các vấn đề liên quan