0
得到了我想要反序列化爲對象的XML。 沒有問題,如果我反序列化只有非多值元素,但我不知道如何處理值元素中的值元素數組。 總是有UnknownNode用的localName = #text,如何反序列化可以是單個或數組的元素?
XML反序列化
<?xml version="1.0" encoding="UTF-8"?>
<issue>
<custom_fields type="array">
<custom_field id="11" name="Version">
<value>7.9.18.31</value>
</custom_field>
<custom_field id="89" name="Tags" multiple="true">
<value type="array">
<value>Tag1</value>
<value>Tag3</value>
<value>Tag6</value>
</value>
</custom_field>
<custom_field id="90" name="started_on">
<value>2017-08-25</value>
</custom_field>
</custom_fields>
</issue>
I類XSD.EXE
using System.Xml.Serialization;
[XmlRoot(IsNullable=false)]
public partial class issue
{
private object[] itemsField;
[XmlElement("custom_fields", typeof(issueCustom_fields))]
[XmlElement("value", typeof(Value))]
public object[] Items
{
get { return itemsField; }
set { itemsField = value; }
}
}
public class Value
{
private Value[] valueField;
private string typeField;
[XmlElement("value")]
public Value[] value
{
get { return valueField; }
set { valueField = value; }
}
[XmlAttribute]
public string type
{
get { return typeField; }
set { typeField = value; }
}
}
public class issueCustom_fields
{
private issueCustom_fieldsCustom_field[] custom_fieldField;
private string typeField;
[XmlElement("custom_field")]
public issueCustom_fieldsCustom_field[] custom_field
{
get { return custom_fieldField; }
set { custom_fieldField = value; }
}
[XmlAttribute]
public string type
{
get { return typeField; }
set { typeField = value; }
}
}
public class issueCustom_fieldsCustom_field
{
private Value[] valueField;
private string idField;
private string nameField;
private string multipleField;
[XmlElement("value")]
public Value[] value
{
get { return valueField; }
set { valueField = value; }
}
[XmlAttribute]
public string id
{
get { return idField; }
set { idField = value; }
}
[XmlAttribute]
public string name
{
get { return nameField; }
set { nameField = value; }
}
[XmlAttribute]
public string multiple
{
get { return multipleField; }
set { multipleField = value; }
}
}
反序列化代碼
var ser = new XmlSerializer(typeof(issue));
var issue = new issue();
using (var sr = new StreamReader("testIssues.xml"))
issue = (issue)ser.Deserialize(sr);
我能得到獲取數據使用:
ser.UnknownNode += (s, ea) =>
{
if (ea.LocalName == "#text" && ea.ObjectBeingDeserialized is Value)
{
Value val = (Value)ea.ObjectBeingDeserialized;
if (val.value == null)
{
val.Val = ea.Text;
}
}
};
但有沒有辦法讓它更平滑的方式使用只是反序列化?
不,這不起作用。主要的東西我不明白 - 「值」類是遞歸使用,但文本存儲在哪裏,沒有字符串字段。 – SLion