在文件中更新 xml 的最佳方法是什么?
What's the best way to update xml in a file?
我一直在寻找在文件中更新 xml 的最佳方法。我刚刚切换到使用 XmlReader(来自 XDocument 方法)来提高速度(不必读取内存中的整个文件)。
我的 XmlReader 方法运行完美,当我需要读取一个值时,它会打开 xml,开始读取并只读取所需的节点,然后关闭所有内容。非常快速有效。
既然我已经完成了这项工作,我想创建一个方法来更新 xml 已经存在的方法。我想保持相同的想法,只在内存中读取需要的内容。所以我的想法是,一直读到我正在更改的节点,然后使用写入器更新该值。
我看到的所有内容都由 XmlReader 读取,而使用 XmlWriter 编写所有内容。如果我这样做,我会假设我必须让它 运行 遍历整个文件,就像 XDocument 所做的那样。例如这个 answer.
是否可以只使用 reader 并读取我要编辑的节点然后更改内部 xml 或其他内容?
在文件中更新 XML 最快最有效的方法是什么?
- 我只想将要编辑的内容读入内存,而不是
整个文件。
- 我还想考虑不包含的节点
存在(需要添加)。
根据设计,XmlReader
表示文档的 "read-only forward-only" 视图,不能用于更新内容。使用 XmlDocument
、XDocument
或 XElement
的 Load
方法仍会导致将整个文件读入内存。 (在幕后,XDocument
和 XElement
仍然使用 XmlReader
。)但是,您可以结合使用原始 XmlReader
和 XElement
一起使用重载Load
方法采用 XmlReader
。
您没有描述您的 XML 结构,但您想做类似的事情:
var reader = XmlReader.Create(@"file://c:\test.xml");
var document = XElement.Load(reader);
document.Add(new XElement("branch", "leaves"));
document.Save("Tree.xml");
要查找特定节点(例如,具有特定属性值),您需要执行与此类似的操作:
var node = document.Descendants("branch")
.SingleOrDefault(e => (string)e.Attribute("name") == "foo");
我一直在寻找在文件中更新 xml 的最佳方法。我刚刚切换到使用 XmlReader(来自 XDocument 方法)来提高速度(不必读取内存中的整个文件)。
我的 XmlReader 方法运行完美,当我需要读取一个值时,它会打开 xml,开始读取并只读取所需的节点,然后关闭所有内容。非常快速有效。
既然我已经完成了这项工作,我想创建一个方法来更新 xml 已经存在的方法。我想保持相同的想法,只在内存中读取需要的内容。所以我的想法是,一直读到我正在更改的节点,然后使用写入器更新该值。
我看到的所有内容都由 XmlReader 读取,而使用 XmlWriter 编写所有内容。如果我这样做,我会假设我必须让它 运行 遍历整个文件,就像 XDocument 所做的那样。例如这个 answer.
是否可以只使用 reader 并读取我要编辑的节点然后更改内部 xml 或其他内容?
在文件中更新 XML 最快最有效的方法是什么?
- 我只想将要编辑的内容读入内存,而不是 整个文件。
- 我还想考虑不包含的节点 存在(需要添加)。
根据设计,XmlReader
表示文档的 "read-only forward-only" 视图,不能用于更新内容。使用 XmlDocument
、XDocument
或 XElement
的 Load
方法仍会导致将整个文件读入内存。 (在幕后,XDocument
和 XElement
仍然使用 XmlReader
。)但是,您可以结合使用原始 XmlReader
和 XElement
一起使用重载Load
方法采用 XmlReader
。
您没有描述您的 XML 结构,但您想做类似的事情:
var reader = XmlReader.Create(@"file://c:\test.xml");
var document = XElement.Load(reader);
document.Add(new XElement("branch", "leaves"));
document.Save("Tree.xml");
要查找特定节点(例如,具有特定属性值),您需要执行与此类似的操作:
var node = document.Descendants("branch")
.SingleOrDefault(e => (string)e.Attribute("name") == "foo");