2013-01-09 299 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> 

从我的经验解串器将无法反序列化元素的属性标记为空(无)。