我想一個序列化對象追加到根元素,我本以爲這很簡單,但被證明是一個具有挑戰性的一點下方的現有XML文件追加對象到XML文件。C#使用序列
的問題是在AddShortcut方法,但我添加了一些更多的代碼的完整性。
我相信什麼,我需要做的是:
- 將文件加載到一個XmlDocument。
- 導航到我要下追加節點(這裏的節點名稱是快捷方式)。
- 創建一些類型的作家,然後序列化對象。
- 保存XmlDocument。
問題出在步驟2和3.我嘗試過不同的變化,但我認爲使用XPathNavigator以某種方式找到要追加的「根」節點是朝正確方向邁出的一步。
我也看着關於這個問題的堆棧溢出幾乎每一個問題。
歡迎任何建議。這裏是我的代碼
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);
}
}
您是否在尋找像'XmlNodeExtensions.SerializeToXmlElement()'從[如何創建套序列化對象的C#(https://stackoverflow.com/a/29307126/3744182)? – dbc
您可以考慮從'XmlDocument'切換到[LINQ到XML(https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-xml)和' XDocument'。這是一個更新的API,更容易使用,並可能在.Net核心等地方得到更好的支持。 – dbc
感謝dbc。我看到了一些使用LINK到XML的解決方案,並想知道這是否會更好。我可能會嘗試,如果我可以很快序列化工作 – cbutler