C#使用序列化将对象附加到xml文件

时间:2017-07-05 20:34:08

标签: c# xml serialization

我正在尝试将序列化对象附加到根元素下面的现有xml文件中,我认为这很简单,但事实证明它有点挑战性。

问题出在AddShortcut方法中,但我为完整性添加了一些代码。

我相信我需要做的是:

  1. 将文件加载到XmlDocument中。
  2. 导航到我想要添加到下面的节点(此处节点名称为快捷方式)。
  3. 创建某种类型的编写器,然后序列化该对象。
  4. 保存XmlDocument。
  5. 麻烦在于步骤2和3.我尝试了不同的变化,但我认为使用XPathNavigator以某种方式找到" root"追加下的节点是朝着正确方向迈出的一步。

    我还查看了有关此主题的Stack Overflow上的几乎所有问题。

    欢迎任何建议。这是我的代码

    class XmlEngine
    {
       public string FullPath { get; set; } // the full path to the xmlDocument
       private readonly XmlDocument xDoc; 
    
       public XmlEngine(string fullPath, string startElement, string[] rElements)
       {
          FullPath = fullPath;
          xDoc = new XmlDocument();
          CreateXmlFile(FullPath, startElement, rElements);            
       }
    
       public void CreateXmlFile(string path, string startElement, string[] rElements)
       {
         try
         {
           if (!File.Exists(path))
           {
             // create a txt writer
             XmlTextWriter wtr = new XmlTextWriter(path, System.Text.Encoding.UTF8);
    
             // make sure the file is well formatted
             wtr.Formatting = Formatting.Indented;
    
             wtr.WriteProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
             wtr.WriteStartElement(startElement);
             wtr.Close();
    
             // write the top level root elements
             writeRootElements(path, rElements);
           }
         }
         catch (Exception ex)
         {
           Console.WriteLine("Error: " + ex.Message);
           Console.WriteLine("Could not create file: " + path);
         }
      }
    
      public void AddShortcut(Shortcut s)
      {
         xDoc.Load(FullPath);
         rootNode = xDoc.AppendChild(xDoc.CreateElement("Shortcuts"));
    
         var serializer = new XmlSerializer(s.GetType());
    
         using (var writer = new StreamWriter(FullPath, true))
         {
            XmlWriterSettings ws = new XmlWriterSettings();
            ws.OmitXmlDeclaration = true;
    
            serializer.Serialize(writer, s);
         }
    
         xDoc.Save(FullPath);
    
      }
    
    }
    

2 个答案:

答案 0 :(得分:1)

此代码示例适用于我:

xml:

<?xml version="1.0" encoding="UTF-8"?>
<Launchpad>
  <Shortcuts>
    <Shortcut Id="1">
      <Type>Folder</Type>
      <FullPath>C:\SomePath</FullPath>
      <Name>SomeFolderName</Name>
    </Shortcut>   
  </Shortcuts>
</Launchpad>

方法:

public void AddShortcut(Shortcut s)
{
   xDoc.Load(FullPath);
   var rootNode = xDoc.GetElementsByTagName("Shortcuts")[0];
   var nav = rootNode.CreateNavigator();
   var emptyNamepsaces = new XmlSerializerNamespaces(new[] {
       XmlQualifiedName.Empty
   });

   using (var writer = nav.AppendChild())
   {
      var serializer = new XmlSerializer(s.GetType());
      writer.WriteWhitespace("");
      serializer.Serialize(writer, s, emptyNamepsaces);
      writer.Close();
   }            
   xDoc.Save(FullPath);
}

答案 1 :(得分:0)

  1. 将文件加载到XmlDocument中。
  2. 导航到我想要添加到下面的节点(此处节点名称为Shortcuts)。
  3. 创建某种类型的编写器,然后序列化该对象。
  4. 保存XmlDocument
  5. 所以:

    public void AddShortcut(Shortcut s)
    {
        // 1. load existing xml
        xDoc.Load(FullPath);
        // 2. create an XML node from object
        XmlElement node = SerializeToXmlElement(s);
        // 3. append that node to Shortcuts node under XML root
        var shortcutsNode = xDoc.CreateElement("Shortcuts")
        shortcutsNode.AppendChild(node);
        xDoc.DocumentElement.AppendChild(shortcutsNode);
        // 4. save changes
        xDoc.Save(FullPath);
    }
    
    public static XmlElement SerializeToXmlElement(object o)
    {
        XmlDocument doc = new XmlDocument();
        using(XmlWriter writer = doc.CreateNavigator().AppendChild())
        {
            new XmlSerializer(o.GetType()).Serialize(writer, o);
        }
        return doc.DocumentElement;
    }
    

    This post