繁体   English   中英

C#,将强类型对象作为元素插入XML文档

[英]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的限制以及您在这些注释中所说的:

  • @Fred,我想尽量减少写入时间,因此不立即全部写入的原因是,此应用程序中的写入时间越短,文件损坏的机会就越少。 – JL 16分钟前
  • 为什么您认为文件损坏的可能性很大? – Frederik Gheysels 9分钟前
  • 从现有的代码测试结果来看,我已经整体上使用了序列化。

假设您的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将其作为子节点中的最后一个元素插入。

C# 强类型ConfigurationBuilder列表<object>从应用设置<div id="text_translate"><p>真的在为这个苦苦挣扎——它应该这么难吗?!</p><p> 我的 appsettings 中有一个简单的 object 数组:</p><pre> "AppSettings": { "Names": [ { "Id": "1", "Name": "Mike" }, { "Id": "2", "Name": "John" } ] }</pre><p> 然后我有一个 class</p><pre> public class AppSettings { public List&lt;Names&gt; Names { get; set; } = new List&lt;Names&gt;(); } public class Names { public string Id { get; set; } public string Name { get; set; } }</pre><p> 我在我的应用设置中读到:</p><pre> var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appSettings.json").Build(); var config = new AppSettings();</pre><p> 这就是出错的地方:</p><pre> config.Names = configuration.GetSection("AppSettings:Names") //&lt;&lt;&lt;&lt; what do I do here?</pre><p> 似乎它都与IConfigurationSection相关,这没有帮助。</p></div></object>

[英]C# strongly typed ConfigurationBuilder List<object> from appsettings

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用C#从xml获取强类型对象? 如何在C#Mongodb强类型驱动程序中删除嵌套文档数组内的元素 C# 强类型属性 c#如何dapperRow到网格视图中显示的强类型对象 c#WCF REST强类型WebGet对象用于参数和验证 来自字符串类型名称的强类型对象(C#) 使用 C# 从强类型类动态构建对象? 从通用(C#)创建强类型对象时发生编译错误 C# 强类型ConfigurationBuilder列表<object>从应用设置<div id="text_translate"><p>真的在为这个苦苦挣扎——它应该这么难吗?!</p><p> 我的 appsettings 中有一个简单的 object 数组:</p><pre> "AppSettings": { "Names": [ { "Id": "1", "Name": "Mike" }, { "Id": "2", "Name": "John" } ] }</pre><p> 然后我有一个 class</p><pre> public class AppSettings { public List&lt;Names&gt; Names { get; set; } = new List&lt;Names&gt;(); } public class Names { public string Id { get; set; } public string Name { get; set; } }</pre><p> 我在我的应用设置中读到:</p><pre> var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appSettings.json").Build(); var config = new AppSettings();</pre><p> 这就是出错的地方:</p><pre> config.Names = configuration.GetSection("AppSettings:Names") //&lt;&lt;&lt;&lt; what do I do here?</pre><p> 似乎它都与IConfigurationSection相关,这没有帮助。</p></div></object> 键入vs强烈键入C#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM