动态插入或更新 XMLRoot 元素
Insert or update XMLRoot Element dynamically
我有 class 数组上有 XMLRoot 和一个 XMLElement。基于客户端,当我序列化我的 class 时,我必须更改 XMLRoot 和 XMLElement。有没有办法动态改变它
[XmlRoot("sample")]
public class MyData
{
private ArrayList map;
public MyData()
{
map = new ArrayList();
}
[XmlElement("url")]
public Location[] Locations
{
get
{
Location[] items = new Location[map.Count];
map.CopyTo(items);
return items;
}
set
{
if (value == null)
return;
Location[] items = (Location[])value;
map.Clear();
foreach (Location item in items)
map.Add(item);
}
}
public int Add(Location item)
{
return map.Add(item);
}
}
如您所见,我的根是 "sample",根据客户端的不同,它可以是 "sample" 或 "reserved"。 XMLElement 是 "url" 并且基于客户端,它可以是 "url" 或 "dataitem"
我正在使用 XMLSerializer 进行序列化
// My condition needs to be here to determine which
// root and xmlelement should use
var xs = new XmlSerializer(typeof(MyData));
var oString = new StringWriterWithEncoding(Encoding.UTF8);
提前致谢
见MSDN-Overrides on XmlSerializer
您可以通过构造函数提供覆盖 - 最好阅读 doku。
示例:
using System.Collections;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
public class Location
{
public string L;
}
[XmlRoot("sample")]
public class MyData
{
public MyData()
{
map = new ArrayList();
}
[XmlElement("url")]
public Location[] Locations
{
get
{
Location[] items = new Location[map.Count];
map.CopyTo(items);
return items;
}
set
{
if (value == null)
return;
Location[] items = (Location[])value;
map.Clear();
foreach (Location item in items)
map.Add(item);
}
}
public int Add(Location item)
{
return map.Add(item);
}
private ArrayList map;
}
internal class Program
{
Xml 打印到屏幕:
private static void DoSerialize(MyData m, XmlSerializer xs)
{
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
settings.NewLineOnAttributes = true;
var sww = new System.IO.StringWriter();
XmlWriter writer = XmlWriter.Create(sww, settings);
xs.Serialize(writer, m);
Console.WriteLine(sww.ToString().Replace("><", ">\r\n<"));
}
重载构造函数的用法:
static void Main()
{
// testdata
MyData m = new MyData
{
Locations = new Location[2]
{
new Location { L = "L1" },
new Location { L = "L2" }
}
};
// simple Serializer
var xs = new XmlSerializer(typeof(MyData));
DoSerialize(m, xs);
Console.WriteLine();
var xs2 = new XmlSerializer(typeof(MyData), XmlAttributeOverride(),
new Type[] { typeof(Location[]) }, RootOverride(), "");
DoSerialize(m, xs2);
Console.ReadLine();
}
// override the root node
private static XmlRootAttribute RootOverride() => new XmlRootAttribute("OtherName");
// override your Languages property
private static XmlAttributeOverrides XmlAttributeOverride()
{
var attrs = new XmlAttributes();
attrs.XmlElements.Add(new XmlElementAttribute("Location"));
var o = new XmlAttributeOverrides();
o.Add(typeof(MyData), "Locations", attrs);
return o;
}
}
输出:
<sample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://
www.w3.org/2001/XMLSchema">
<url>
<L>L1</L>
</url>
<url>
<L>L2</L>
</url>
</sample>
<OtherName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http
://www.w3.org/2001/XMLSchema">
<Location>
<L>L1</L>
</Location>
<Location>
<L>L2</L>
</Location>
</OtherName>
我有 class 数组上有 XMLRoot 和一个 XMLElement。基于客户端,当我序列化我的 class 时,我必须更改 XMLRoot 和 XMLElement。有没有办法动态改变它
[XmlRoot("sample")]
public class MyData
{
private ArrayList map;
public MyData()
{
map = new ArrayList();
}
[XmlElement("url")]
public Location[] Locations
{
get
{
Location[] items = new Location[map.Count];
map.CopyTo(items);
return items;
}
set
{
if (value == null)
return;
Location[] items = (Location[])value;
map.Clear();
foreach (Location item in items)
map.Add(item);
}
}
public int Add(Location item)
{
return map.Add(item);
}
}
如您所见,我的根是 "sample",根据客户端的不同,它可以是 "sample" 或 "reserved"。 XMLElement 是 "url" 并且基于客户端,它可以是 "url" 或 "dataitem"
我正在使用 XMLSerializer 进行序列化
// My condition needs to be here to determine which
// root and xmlelement should use
var xs = new XmlSerializer(typeof(MyData));
var oString = new StringWriterWithEncoding(Encoding.UTF8);
提前致谢
见MSDN-Overrides on XmlSerializer
您可以通过构造函数提供覆盖 - 最好阅读 doku。
示例:
using System.Collections;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
public class Location
{
public string L;
}
[XmlRoot("sample")]
public class MyData
{
public MyData()
{
map = new ArrayList();
}
[XmlElement("url")]
public Location[] Locations
{
get
{
Location[] items = new Location[map.Count];
map.CopyTo(items);
return items;
}
set
{
if (value == null)
return;
Location[] items = (Location[])value;
map.Clear();
foreach (Location item in items)
map.Add(item);
}
}
public int Add(Location item)
{
return map.Add(item);
}
private ArrayList map;
}
internal class Program
{
Xml 打印到屏幕:
private static void DoSerialize(MyData m, XmlSerializer xs)
{
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
settings.NewLineOnAttributes = true;
var sww = new System.IO.StringWriter();
XmlWriter writer = XmlWriter.Create(sww, settings);
xs.Serialize(writer, m);
Console.WriteLine(sww.ToString().Replace("><", ">\r\n<"));
}
重载构造函数的用法:
static void Main()
{
// testdata
MyData m = new MyData
{
Locations = new Location[2]
{
new Location { L = "L1" },
new Location { L = "L2" }
}
};
// simple Serializer
var xs = new XmlSerializer(typeof(MyData));
DoSerialize(m, xs);
Console.WriteLine();
var xs2 = new XmlSerializer(typeof(MyData), XmlAttributeOverride(),
new Type[] { typeof(Location[]) }, RootOverride(), "");
DoSerialize(m, xs2);
Console.ReadLine();
}
// override the root node
private static XmlRootAttribute RootOverride() => new XmlRootAttribute("OtherName");
// override your Languages property
private static XmlAttributeOverrides XmlAttributeOverride()
{
var attrs = new XmlAttributes();
attrs.XmlElements.Add(new XmlElementAttribute("Location"));
var o = new XmlAttributeOverrides();
o.Add(typeof(MyData), "Locations", attrs);
return o;
}
}
输出:
<sample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://
www.w3.org/2001/XMLSchema">
<url>
<L>L1</L>
</url>
<url>
<L>L2</L>
</url>
</sample>
<OtherName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http
://www.w3.org/2001/XMLSchema">
<Location>
<L>L1</L>
</Location>
<Location>
<L>L2</L>
</Location>
</OtherName>