[英]C#, insert strongly typed object into XML Document as Element
我有一个包含以下结构的XML文档:
它或多或少是一系列事件:
<Events>
<Event>
<DateTime></DateTime>
<EventType></EventType>
<Result></Result>
<Provider></Provider>
<ErrorMessage></ErrorMessage>
<InnerException></InnerException>
</Event>
</Events>
在C#中,我有一个名为Event的持久对象:
现在,鉴于该文档已经存在,并保存到文件中,我称之为:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(dataPath);
现在如何向事件添加新的事件项?
我的C#代码中有一个类型严格的Event项,并希望将其作为最后一个子项插入XML对象的Events集合中。
我想这就是我真正要问的: https : //stackoverflow.com/questions/1457033/c-insert-a-strongly-typed-object-as-node-in-existing-xml-document
看一下Xml序列化属性。
你可以这样做:
[XmlRoot("Event")]
public class Event
{
[XmlElement("DateTime")]
public string DateTime
{
get;
set;
}
[XmlElement("EventType")]
public EnumReportingEventType EventType
{
get;
set;
}
[XmlElement("Result")]
public EnumReportingResult Result
{
get;
set;
}
[XmlElement("Provider")]
public string Provider
{
get;
set;
}
[XmlElement("ErrorMessage")]
public string ErrorMessage
{
get;
set;
}
[XmlElement("InnerException")]
public string InnerException
{
get;
set;
}
}
实际上,如果类的属性与Xml中的元素具有相同的名称,则不必使用XmlElement属性。
然后,您可以使用XmlSerializer进行序列化和反序列化。
编辑:那么,创建代表存储在现有xml中的整个类型的类型会更好吗?
反序列化,为附加属性赋值,然后序列化回?
如果使用的是.Net 3.5,则可以使用Linq to XML,如下所示的方法将起作用
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XComment("Event document"),
new XElement("Events",
new XElement ("Event",
new XElement("DateTime", event.DateTime),
new XElement("EventType", event.EventType),
new XElement("Result", event.Result),
new XElement("Provider", event.Provider),
new XElement("ErrorMessage", event.ErrorMessage),
new XElement("InnerException", event.InnerException)
)
));
doc.Save(@"c:\sample.xml");
如果您有一个现有的xml文档,您想要附加到以下内容,则需要以下内容。
XDocument doc = XDocument.Load(@"c:\sample.xml");
XElement events = doc.Element(XName.Get("Events"));
events.Add(new XElement ("Event",
new XElement("DateTime", event.DateTime),
new XElement("EventType", event.EventType),
new XElement("Result", event.Result),
new XElement("Provider", event.Provider),
new XElement("ErrorMessage", event.ErrorMessage),
new XElement("InnerException", event.InnerException)
));
doc.Save(@"c:\sample.xml");
在“ Event”类的末尾附近插入一个XmlElement字段,如下所示:
[System.Xml.Serialization.XmlAnyElementAttribute()]
public System.Xml.XmlElement Any { get; set }
您可以随意命名,只要上面带有“ XmlAnyElementAttribute”即可。
您可以使用以下类似的方法将强类型的对象序列化到该字段中:
MyParentObject parent = new MyParentObject(){ ... };
MyObject obj = new MyObject(){ /*... initialize*/ };
XmlSerializer ser = new XmlSerializer(typeof(MyObject));
XmlDocument doc = new XmlDocument();
using (StringWriter sw = new StringWriter())
{
ser.Serialize(sw, obj);
doc.LoadXml(sw.ToString());
}
parent.Any = (XmlElement)doc.DocumentElement;
序列化的XML将很好地附加到您的类上,它将包含正确的名称空间。
只需使用XmlDocument对其进行手工编码。 您可以在您要保存的文档中添加一个进行转换或插入的类。
这是基于.net 2.0的限制以及您在这些注释中所说的:
假设您的Event
类已经可以使用XmlSerializer
进行序列化,则可以执行以下操作:
XmlSerializer ser = new XmlSerializer(typeof(Event));
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(dataPath);
Event evt = ...;
XmlDocument evtDoc = new XmlDocument();
using (XmlWriter writer = evtDoc.CreateNavigator().AppendChild())
{
ser.Serialize(writer, evt);
}
XmlNode evtNode = evtDoc.RemoveChild(evtDoc.DocumentElement);
XmlNode events = xmlDoc.SelectSingleNode("/Events");
events.AppendChild(evtNode);
您想要做的事情是这样的:
doc.ChildNode[0].AppendChild(MethodToReturnADeserializedObject(event));
创建一种将事件对象反序列化为xml节点的方法。 然后使用AppendChild将其作为子节点中的最后一个元素插入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.