gpt4 book ai didi

c# - XDocument 更改所有属性名称

转载 作者:行者123 更新时间:2023-11-30 15:11:11 26 4
gpt4 key购买 nike

我有一个类似于

的 XDocument
<root>
<a>
<b foo="1" bar="2" />
<b foo="3" bar="4" />
<b foo="5" bar="6" />
<b foo="7" bar="8" />
<b foo="9" bar="10" />
</a>
</root>

我希望将属性 foo 更改为其他内容,并将属性 bar 更改为其他内容。我怎样才能轻松做到这一点?我当前的版本(下图)堆满了大文件,而且有难闻的气味。

        string dd=LoadedXDocument.ToString();
foreach (var s in AttributeReplacements)
dd = dd.Replace(s.Old+"=", s.New+"=");

最佳答案

通过文本搜索和替换执行此操作应该使用 StringBuilder 来避免在循环中创建字符串的正常问题(大量垃圾)。也很难防止误报(如果与属性匹配的文本出现在文本节点中怎么办?)

具有不同权衡的更好选择包括:

  1. 加载到 XDocument 或 XmlDocument,遍历树以替换匹配的属性。
  2. 使用 XSLT
  3. 从 XmlReader 读取并直接写入 XmlWriter,并更改属性。

其中 #3 避免将整个文档加载到内存中。 #2 需要 XSLT 技能,但很容易允许任意数量的替换(XSLT 的核心可以是一个模板,在运行时注入(inject)新旧属性对)。 #1 可能是最简单的,但是整个文档都在内存中,并且处理多个替换的开销。

我可能会将使用 Xml Reader/Writer 方法的 XSLT 作为备份。

然而,#1 应该是最简单的实现方式,例如(在其他细节中忽略 XML 命名空间):

using System.Xml.Linq;
using System.Xml.XPath;

var xdoc = XDocument.Load(....);
var nav = xdoc.CreateNavigator();

foreach (repl in replacements) {
var found = (XPathNodeIterator) nav.Evaluate("//@" + repl.OldName);

while (found.MoveNext()) {
var node = found.Current;
var val = node.Value;
node.DeleteSelf(); // Moves ref to parent.
node.CreateAttribute("", repl.NewName, "", val);
}
}

最终的选择将取决于平衡性能(尤其是处理大型文档时的内存)和复杂性。但只有您(和您的团队)可以调用电话。

关于c# - XDocument 更改所有属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2643267/

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