【发布时间】:2021-08-18 15:30:24
【问题描述】:
我注意到XElement 是一个类,所以我尝试了类似的方法:
var doc = new XDocument(
new XDeclaration("1.0", "utf8", "yes"),
new XElement("Root")
);
var root = doc.Root;
var com = new XElement("Component", new XAttribute("name", "arm"));
root.Add(com);
root.Add(com);
root.Add(com);
com.Add(new XAttribute("type", 1));
Console.WriteLine(doc);
但输出是:
<Root>
<Component name="arm" type="1" />
<Component name="arm" />
<Component name="arm" />
</Root>
我也试过SetAttributeValue(),得到了同样的结果。
为什么type属性只附加在第一个组件上?
【问题讨论】:
-
因为它是made that way。 “当添加
XNode或XAttribute对象时,如果新内容没有父对象,则对象只是附加到 XML 树。如果新内容已经是父对象并且是另一个 XML 树的一部分,那么新内容被克隆,并且新克隆的内容被附加到 XML 树中。”如果您考虑一下,在询问文档顺序时,尝试维护引用语义会导致非常不直观的结果。 -
为什么不把
com.Add(new XAttribute("type", 1));放在root.Add(com);前面,而不是后面? -
如果您更喜欢查看sources,那么您会看到它会调用
CloneNode()方法来进行后续调用(因为将设置com的父级)。通过修改com实例,您只会更改未克隆的第一个节点。 -
@JeroenMostert 除非有 dup-target(我找不到),否则您可能希望将此作为答案发布。