Joh*_*oDo 5 c# serialization xml-serialization xml-deserialization deserialization
假设这样的XML:
<my:Root xmlns:my="http://foo/bar">
<my:FieldBasic>content</my:FieldBasic>
<my:FieldComplex>
<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml">
<div><h1>content</h1></div>
</html>
</my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)
还有一个类:
[Serializable]
[XmlType(AnonymousType = true, Namespace = "http://foo/bar")]
[XmlRoot(ElementName = "Root", Namespace = "http://foo/bar", IsNullable = false)]
public class MyRoot
{
public string FieldBasic { get; set; }
public string FieldComplex { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何反序列化为<my:FieldComplex>内部的字符串FieldComplex?它在内部找到HTML时失败.我想让它给我一个包含这个内容的字符串:
<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml">
<div><h1>content</h1></div>
</html>
Run Code Online (Sandbox Code Playgroud)
如果我宣布FieldComplex为public object FieldComplex(即xsd:anyType)它有点工作,我得到一个XMLNode[]里面,我可以使用.
但我需要FieldComplex序列化的类型字符串,因为序列化XML不包含HTML,它将像:
<my:Root xmlns:my="http://foo/bar">
<my:FieldBasic>content</my:FieldBasic>
<my:FieldComplex>content</my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)
声明FieldComplex为对象将在<my:FieldComplex>元素上插入这些属性:
xmlns:q1="http://www.w3.org/2001/XMLSchema" p3:type="q1:string" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance
Run Code Online (Sandbox Code Playgroud)
我不希望这样.我也不想使用不同的类进行序列化和反序列化.
那么,有可能吗?
总而言之,是否有可能拥有这个课程:
public class MyRoot
{
public string FieldBasic { get; set; }
public string FielComplex { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
序列化为:
<my:Root xmlns:my="http://foo/bar">
<my:FieldBasic>content</my:FieldBasic>
<my:FieldComplex>content</my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)
并从此反序列化:
<my:Root xmlns:my="http://foo/bar">
<my:FieldBasic>content</my:FieldBasic>
<my:FieldComplex>
<html xml:space="preserve" xmlns="http://www.w3.org/1999/xhtml">
<div><h1>content</h1></div>
</html>
</my:FieldComplex>
<my:Root>
Run Code Online (Sandbox Code Playgroud)
?
PS只是为了解释"为什么?".我有一个班级女巫被序列化.然后,序列化的XML遍历应用程序中的多个节点,并最终返回,但如上所述进行了更改.这些层执行一些XML验证,并且在输入时具有额外的属性或元素使验证失败并停止流程.我想将返回XML映射到同一个类.内容只是字符串从它的角度来看,但序列化/反序列化当然不一样:(
小智 3
这还没有完全完成,因为我不记得是否可以/如何将命名空间前缀添加到 Xml 序列化中的根元素。但是,如果您在 MyRoot 类中实现 IXmlSerialized 接口,如下所示:
[XmlRoot("Root", Namespace="http://foo/bar")]
public class MyRoot : IXmlSerializable
Run Code Online (Sandbox Code Playgroud)
然后自己编写 XML 序列化方法,如下所示:
void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
{
reader.MoveToContent();
var outerXml = reader.ReadOuterXml();
XElement root = XElement.Parse(outerXml);
this.FieldBasic = root.Elements(XName.Get("FieldBasic", "http://foo/bar")).First().Value;
this.FieldComplex = root.Elements(XName.Get("FieldComplex", "http://foo/bar")).First().Elements().First().Value.Trim();
}
void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteRaw(String.Format("\r\n\t<my:FieldBasic>\r\n\t\t{0}\r\n\t</my:FieldBasic>", this.FieldBasic));
writer.WriteRaw(String.Format("\r\n\t<my:FieldComplex>\r\n\t\t{0}\r\n\t</my:FieldComplex>\r\n", this.FieldComplex));
}
Run Code Online (Sandbox Code Playgroud)
(从 GetSchema 方法返回 null)
这至少应该让你非常接近你所追求的目标。
您可能还会发现这些链接很有帮助。
| 归档时间: |
|
| 查看次数: |
2155 次 |
| 最近记录: |