2013-01-09 200 views
13

使用C#.NET 4 - XML示例(實際樣品有6個屬性)多元素反序列化XML文件屬性 - 屬性不反序列化

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="">25</TestElement> 
</TestXML> 

對於我的類定義我有以下幾點:

public class TestXML() { 
    public TestXML() {} 

    public int TestElement {get; set;} 
    [XmlAttribute] 
    public string attr1 {get; set;} 
    [XmlAttribute] 
    public string attr2 {get; set;} 
    [XmlIgnore] 
    public DateTime DateAdded {get; set;} 
    [XmlAttribute("DateAdded")] 
    public string dateadded { 
     get{ return (DateAdded == null ? "" : DateAdded.ToString();} 
     set{ if(!value.Equals("")) DateAdded = DateTime.Parse(value);} 
    } 
} 

現在的代碼進行反序列化:

string xml = "<TestXML><TestElement attr1=\"MyAttr\" attr2=\"1\" DateAdded=\"\">26</TestElement></TestXML>" 
using (StringReader sr = new StringReader(xml)) { 
    XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
    TestXML myxml = (TestXML)serializer.Deserialize(sr); 
} 

現在我們得到的結果是(在VS觀看對象):

myxml 
    attr1   | null 
    attr2   | null 
    TestElement | 25 

完全喪失了爲什麼屬性不會反序列化。

+1

''僅將**指向** public int TestElement {get; set;}' –

+0

此問題的目標是讓代碼正常工作,xml格式正確。 –

回答

23

要做到這一點,你需要兩個層次:

[XmlRoot("TestXML")] 
public class TestXml { 
    [XmlElement("TestElement")] 
    public TestElement TestElement { get; set; } 
} 

public class TestElement { 
    [XmlText] 
    public int Value {get;set;} 

    [XmlAttribute] 
    public string attr1 {get;set;} 

    [XmlAttribute] 
    public string attr2 {get;set;} 
} 

注意,> 26 <可能會導致問題太(空白);你可能需要它是一個字符串而不是int。

+0

更正值周圍的空格,將其重新格式化爲兩個類,但第一個類的引用變量返回null; –

+0

@pyTeaParty只需將'public TestElement {get; set;}'改爲:'public TestElement TestElement {get; set;}'。 – Mir

+0

啊,忘了匹配的元素名稱,所以是這兩個類是對我的更大的考驗,我非常感謝你的解決方案@Eve –

2

您正在定義TestElement上的屬性,而它們應該在TestXML上。例如:

@"<TestXML attr1=""MyAttr"" attr2=""1""> 
     <TestElement>26</TestElement> 
    </TestXML>" 
+0

XML格式正確我懷疑問題出在類定義中,只是沒有看到需要做什麼,因爲除了只有一個屬性外,其他示例顯示的是相同的設置。 –

+0

@pyTeaParty XML在語法上是正確的,但我們不知道他是希望代碼適應它還是理解它爲什麼不起作用。我認爲指出XML應該如何用於他的代碼工作會很有用。 – Mir

+0

感謝您試圖讓代碼與XML一起工作,這正是我想要做的。 –

0

我只是跑測試序列化/反序列化你的對象,它似乎做工精細

測試:

TestXML obj = new TestXML{ attr1 = "Attrib1", attr2 = "Attrib2", DateAdded = DateTime.Now, TestElement = 44}; 

XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); 
using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.OpenOrCreate)) 
{ 
    serializer.Serialize(stream, obj); 
} 

using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.Open)) 
{ 
    TestXML myxml = (TestXML)serializer.Deserialize(stream); 
} 

反序列確定的所有屬性。

結果:

enter image description here

XML:

<?xml version="1.0"?> 
<TestXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" attr1="Attrib1" attr2="Attrib2" DateAdded="10/01/2013 9:46:23 a.m."> 
    <TestElement>44</TestElement> 
</TestXML> 
+0

仔細看,我看到你先序列化對象。顯然,xml不匹配,所以我的類定義是錯誤的。 –

0

作爲附加的註釋來接受的答案。確保XML元素不包含零=「true」屬性是這樣的:

<TestXML> 
    <TestElement attr1="MyAttr" attr2="1" DateAdded="" xsi:nil="true">25</TestElement> 
</TestXML> 

從我的經驗解串器將無法反序列化元素的屬性標記爲空(無)。