2012-07-02 40 views
12

Tôi gặp sự cố:Nối tiếp XML cùng một thẻ hai lần

Tôi phải tuần tự hóa lớp thành tệp XML. Nhưng hai thuộc tính phải được đặt tên có cùng tên:

mong muốn xml:

<?xml version="1.0"?> 
<Test> 
    <HeaderText> 
    <Tag1>AAA</Tag1> 
    </HeaderText> 
    <HeaderText> 
    <Tag2>BBB</Tag2> 
    </HeaderText> 
</Test> 

Tôi không cần phải deserialize nó trở lại phản đối.

Code:

public class Header1 
{ 
    [XmlElement("Tag1")] 
    public String Tag1 { get; set; } 
} 

public class Header2 
{ 
    [XmlElement("Tag2")] 
    public String Tag2 { get; set; } 
} 

public class Test 
{ 
    [XmlElement("HeaderText")] 
    public Header1 Header1 { get; set; } 

    [XmlElement("HeaderText")] 
    public Header2 Header2 { get; set; } 
} 

var doc = new Test 
{ 
    Header1 = new Header1 { Tag1 = "AAA" }, 
    Header2 = new Header2 { Tag2 = "BBB" } 
}; 

var xml = new XmlSerializer(typeof(Test)); 
using (var fs = new FileStream("test.xml", FileMode.Create)) 
{ 
    xml.Serialize(fs, doc); 
} 

Mã này không hoạt động.

Phần tử XML 'Tiêu đề' từ không gian tên '' đã có mặt trong phạm vi hiện tại. Sử dụng các thuộc tính XML để chỉ định một tên hoặc không gian tên XML khác cho phần tử.

Tôi có thể làm gì?

dụ thực thế giới:

<Product> 
    <RecordReference>1-15991</RecordReference> 
    <MainSubject> 
     <MainSubjectSchemeIdentifier>66</MainSubjectSchemeIdentifier> 
     <SubjectCode>2</SubjectCode> 
    </MainSubject> 
    <MainSubject> 
     <MainSubjectSchemeIdentifier>20</MainSubjectSchemeIdentifier> 
     <SubjectHeadingText>Venäläisiä kirjoja: uskonto, teosofia, mystiikka</SubjectHeadingText> 
    </MainSubject> 
</Product> 

Trả lời

9

Sử dụng một mảng:

public class Test 
{ 
    [XmlElement("HeaderText")] 
    public string[] HeaderText { get; set; } 
} 

và sau đó:

var doc = new Test 
{ 
    HeaderText = new[] { "AAA", "BBB" } 
}; 
var xml = new XmlSerializer(typeof(Test)); 
using (var fs = new FileStream("test.xml", FileMode.Create)) 
{ 
    xml.Serialize(fs, doc); 
} 

Cũng làm việc với List<string>.


UPDATE:

Với đối tượng phức tạp bạn xác định một mô hình:

public class Header 
{ 
    public string Tag { get; set; } 
} 

và sau đó bạn có một bộ sưu tập các mô hình này:

public class Test 
{ 
    [XmlElement("HeaderText")] 
    public Header[] HeaderText { get; set; } 
} 

và sau đó bạn serialize:

var doc = new Test 
{ 
    HeaderText = new[] 
    { 
     new Header { Tag = "AAA" }, 
     new Header { Tag = "BBB" } 
    } 
}; 
var xml = new XmlSerializer(typeof(Test)); 
using (var fs = new FileStream("test.xml", FileMode.Create)) 
{ 
    xml.Serialize(fs, doc); 
} 
+0

Cũng làm việc với 'public List HeaderText {} ', dễ dàng hơn để thêm/loại bỏ các mục. – Tisho

+0

@Tisho, yeap, tôi đã cập nhật câu trả lời của mình để bao gồm thông tin này. –

+0

Cảm ơn, nó hoạt động cho các thuộc tính đơn giản. Vui lòng xem mã cập nhật được đề cập. – Lari13

8

Bạn có thể nói serializer để bỏ qua thuộc tính hiện tại của bạn, và thêm một cái mới với mục đích serialization:

public class Test 
{ 
    [XmlIgnore] 
    public String Header1 { get; set; } 

    [XmlIgnore] 
    public String Header2 { get; set; } 

    [XmlElement("HeaderText")] 
    public String[] HeaderText 
    { 
     get{ return new[]{Header1,Header2}; } 
     set{ if(value.Length == 2) { Header1 = value[0]; Header2 = value[1];} } 
    } 
} 

Sống dụ: http://rextester.com/YVEF64085

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