lid*_*min 4 c# xml-serialization
我有以下XML:
<Plan>
<Error>0</Error>
<Description>1</Description>
<Document>
<ObjectID>06098INF1761320</ObjectID>
<ced>109340336</ced>
<abstract>DAVID STEVENSON</abstract>
<ced_a />
<NAM_REC />
<ced_ap2 />
</Document>
</Plan>
Run Code Online (Sandbox Code Playgroud)
我用它反序列化它:
[XmlRoot("Plan")]
public class EPlan
{
[XmlElement("Error")]
public string Error { get; set; }
[XmlElement("Description")]
public string Description { get; set; }
[XmlElement("Document")]
public List<EDocument> Documents { get; set; }
}
public class EDocument
{
[XmlText]
public string Document { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是我希望元素"Document"将其内部XML包含为单个字符串,我的意思是,该对象应该具有以下值:
obj.Error = "0";
obj.Description = "1";
obj.Documents[0].Document = "<ObjectID>06098INF1761320</ObjectID><ced>109340336</ced><abstract>DAVID STEVENSON</abstract><ced_a /><NAM_REC /><ced_ap2 />";
Run Code Online (Sandbox Code Playgroud)
但我之前提到的方式仍然是检索NULL"Document"属性.
是否有可能实现我想要的行为?任何帮助,将不胜感激.
car*_*ira 12
XmlText期望一个文本节点,但你拥有的实际上是元素节点.我不知道是否有直接的方法,但你可以有一个XmlAnyElement节点来收集反序列化的结果,然后你将它们合并到一个字符串中,如果你需要的话,如下面的例子所示.
[XmlRoot("Plan")]
public class EPlan
{
[XmlElement("Error")]
public string Error { get; set; }
[XmlElement("Description")]
public string Description { get; set; }
[XmlElement("Document")]
public List<EDocument> Documents { get; set; }
}
[XmlType]
public class EDocument
{
private string document;
[XmlAnyElement]
[EditorBrowsable(EditorBrowsableState.Never)]
public XmlElement[] DocumentNodes { get; set; }
[XmlIgnore]
public string Document
{
get
{
if (this.document == null)
{
StringBuilder sb = new StringBuilder();
foreach (var node in this.DocumentNodes)
{
sb.Append(node.OuterXml);
}
this.document = sb.ToString();
}
return this.document;
}
}
}
static void Test()
{
string xml = @"<Plan>
<Error>0</Error>
<Description>1</Description>
<Document>
<ObjectID>06098INF1761320</ObjectID>
<ced>109340336</ced>
<abstract>DAVID STEVENSON</abstract>
<ced_a />
<NAM_REC />
<ced_ap2 />
</Document>
<Document>
<ObjectID>id2</ObjectID>
<ced>ced2</ced>
<abstract>abstract2</abstract>
<ced_a />
<NAM_REC />
<ced_ap2 />
</Document>
</Plan>";
XmlSerializer xs = new XmlSerializer(typeof(EPlan));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
EPlan obj = xs.Deserialize(ms) as EPlan;
Console.WriteLine(obj.Documents[0].Document);
}
Run Code Online (Sandbox Code Playgroud)