gpt4 book ai didi

c# - 替换 xml 元素

转载 作者:行者123 更新时间:2023-11-30 12:17:53 27 4
gpt4 key购买 nike

我正在做类似的事情:

var results = from d in myDocument.Elements().Descendants("myName") select d;

foreach (var result in results){
if (sth...){
result.replace(myXElement);
}
}

问题是,当我替换一个元素时,我无法迭代到下一个元素,因为存在空引用。 (var result in results)。

是否有任何其他方法可以用另一个元素替换该元素并且仍然能够遍历该文档?

感谢帮助

堆栈跟踪是:

System.NullReferenceException was unhandled  Message="Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu."Source="System.Xml.Linq"  StackTrace:       w System.Xml.Linq.XContainer.d__a.MoveNext()       w System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()       w DocSorter.Merge.MergeFiles(String contentFilePath, String directoryPath) w D:\DocSorter\DocSorter\Merge.cs:wiersz 39       w DocSorter.MainBox.btnMergeFiles_Click(Object sender, EventArgs e) w D:\DocSorter\DocSorter\MainBox.cs:wiersz 85       w System.Windows.Forms.Control.OnClick(EventArgs e)       w System.Windows.Forms.Button.OnClick(EventArgs e)       w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)       w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)       w System.Windows.Forms.Control.WndProc(Message& m)       w System.Windows.Forms.ButtonBase.WndProc(Message& m)       w System.Windows.Forms.Button.WndProc(Message& m)       w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)       w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)       w System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)       w System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)       w System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)       w System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)       w System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)       w System.Windows.Forms.Application.Run(Form mainForm)       w DocSorter.Program.Main() w D:\DocSorter\DocSorter\Program.cs:wiersz 18       w System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)       w System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)       w Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()       w System.Threading.ThreadHelper.ThreadStart_Context(Object state)       w System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)       w System.Threading.ThreadHelper.ThreadStart()  InnerException: 

最佳答案

您不能在遍历 IEnumerable 时修改它。

由于 LINQ to XML 使用延迟执行,它会在您修改 XML 时尝试查找后代。

要解决这个问题,您需要先将元素放入数组中,然后再遍历它们,如下所示:

var results = myDocument.Descendants("myName").ToArray();

foreach (var result in results){
if (sth...){
result.replace(myXElement);
}
}

通过调用 ToArray(),您可以强制它立即枚举元素,而不是在循环遍历元素时查找它们。

关于c# - 替换 xml 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2993469/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com