使用XmlAnyAttribute时,反序列化xml的值字段没有值

时间:2013-01-09 22:06:40

标签: c# .net xml-serialization

这是XML示例,但使用不同的方法来定义属性:

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

现在我的课程定义:

public class TestXML() {
   [XmlElement("TestData")]
   public IntegerValue value {get; set;}
}

public class IntegerValue() {
   public int value {get; set;}
   [XmlAnyAttribute]
   public string[] XAttributes {get; set;}
}

现在要反序列化的代码:

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

产生以下结果:

myxml
   value     |  0
   XAttributes  {string[7]}
     [0] "MyAttr"
     [1] "1"
     [2] ""

xml格式正确。无法使用XMLAnyAttribute获取反序列化的值。想要获取名称以及属性的值,但到目前为止尚未找到该方法的示例。

2 个答案:

答案 0 :(得分:2)

您只需将string[] XAttributes更改为XmlAttribute[] XAttributes这将返回整个属性,以便您可以访问名称和值

public class IntegerValue
{
   public int value {get; set;}

   [XmlAnyAttribute]
   public XmlAttribute[] XAttributes { get; set; }
}

我的测试:

public class TestXML
{
    [XmlElement("TestData")]
    public IntegerValue value { get; set; }
}

public class IntegerValue
{
    public int value { get; set; }

    [XmlAnyAttribute]
    public XmlAttribute[] XAttributes { get; set; }
}


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

结果:

enter image description here

注意:您发布的xml无效,TestData的结束标记为TestElement无效

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

应该是

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

答案 1 :(得分:0)

未设置value属性,因为您需要将其定义为XML文本。试试这个:

public class IntegerValue() {
  [XmlText]
  public int value {get; set;}
  [XmlAnyAttribute]
  public string[] XAttributes {get; set;}
}

注意,它的c#约定不包括属性修饰中的字符串'Attribute'。所以它