【问题标题】:Serializing an object to XML and appending it to XML file将对象序列化为 XML 并将其附加到 XML 文件
【发布时间】:2016-01-23 07:40:41
【问题描述】:

我正在尝试将(马)对象转换为 XmlElement,以便可以将其附加到 XML 文件中。这是我最近尝试过的。

        // create writer and serializer to add horse to xml
        var stringwriter = new StringWriter();
        var serializer = new XmlSerializer(horse.GetType());

        // serialize horse object to xml 
        serializer.Serialize(stringwriter, horse);
        var xmlStr = stringwriter.ToString();

        // format string to xml 
        var horseXml = new XmlDocument();
        horseXml.LoadXml(xmlStr);

        // get horse element from horseXml
        var horseEl = horseXml.ChildNodes[0];

        // assign xmldb to xml document
        var xmlDb = new XmlDocument();
        xmlDb.Load(xmlDbFilepath);
        XmlNode root = xmlDb.DocumentElement;

       // add horseEl to root of xmlDb
        root.AppendChild(horseEl);
        xmlDb.Save(xmlDbFilepath);

不幸的是,一旦我到达 root.AppendChild(horseEl) 行,这将引发以下异常:“System.Xml.dll 中发生‘System.ArgumentException’类型的异常,但未在用户代码中处理附加信息:要插入的节点来自不同的文档上下文。”

任何建议将不胜感激!

编辑:这是一个显示 my horse class and xmldb 的链接。

【问题讨论】:

  • 请包含horse的类定义和文件xmlDbFilepath的内容。
  • 马类不完整。请添加子类和枚举的定义。
  • 啊,不错。对于那个很抱歉。我刚刚用另一个更新了要点。我应该提到,xml 文件最初是通过序列化 List 创建的。这是我用于此的代码:XmlSerializer x = new XmlSerializer(horses.GetType()); var stream = new FileStream(xmlDbFilepath, FileMode.Create); x.Serialize(stream, horses); stream.Close();
  • 你试过谷歌错误信息时得到的建议吗?

标签: c# asp.net xml xml-serialization


【解决方案1】:

试试这个。如果数据和类结构正确,应该可以工作。

// same code till this

// get horse element from horseXml
XmlElement horseEl = horseXml.DocumentElement; //[1] get the doc element

// assign xmldb to xml document
var xmlDb = new XmlDocument();
xmlDb.Load(xmlDbFilepath);
//XmlNode root = xmlDb.DocumentElement; [2] removed

// add horseEl to root of xmlDb
//var newRoot = root.AppendChild(clonedHorseEl); [3] removed
var xe = xmlDb.CreateElement("Horse"); //[4] Create new Horse element on xmlDb
xe.InnerXml = horseEl.InnerXml; //[5] copy horseEl content
xmlDb.DocumentElement.AppendChild(xe);

xmlDb.Save(xmlDbFilepath);

在 cmets 中提到了这些变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多