【问题标题】:Copy Node and change Value of an Attribute复制节点并更改属性的值
【发布时间】:2017-09-25 11:34:12
【问题描述】:

我有以下 XML 文件。我想复制一个新的“测试”并更改测试的 ID。怎么可能?

我已经可以复制节点,不幸的是不在正确的位置(见图),我也无法更改 ID。 谁有我的解决方案?

之前:

之后:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(Before.xml");

XmlNode Set = xmldoc.DocumentElement;
string strXmlQuery = "/Toolings/Testing/Test1";

XmlNode NodeToCopy = Set.SelectSingleNode(strXmlQuery);
XmlNode NewNode = NodeToCopy.CloneNode(true);

NodeToCopy.AppendChild(NewNode);

Set.InsertAfter(NewNode, Set.LastChild);

XPathNavigator navigator = xmldoc.CreateNavigator();

navigator.MoveToRoot();
navigator.MoveToFirstChild();
navigator.MoveToFirstChild();
navigator.MoveToFirstChild();
navigator.MoveToFirstChild();
navigator.SetValue("5678");

xmldoc.Save(After.xml");

【问题讨论】:

  • 你是说“之前”是正确的吗?因为“之后”更有意义。
  • 最后,我想要一个“After”。所以“之后”是正确的。
  • 知道了。但是您真的希望“测试”增加吗?测试1,测试2等..?这样做会使使用您的数据变得复杂,它们都应该只是“测试”。
  • 是的,你是对的!当所有人都在调用“测试”时就足够了。没有增量。

标签: c# xml xpath copy


【解决方案1】:

这是一个使用System.Xml.Linq.XDocument 的示例,它是一个比XmlDocument 更简单的API:

//You can also use Load(), this is just so I didn't have to make a file
XDocument doc = XDocument.Parse("<Toolings><Testing><Test><ID>1234</ID></Test></Testing></Toolings>");

//Grab the first Test node (change the predicate if you have other search criteria)
var elTest = doc.Descendants().First(d => d.Name == "Test");

//Copy the node, only necessary if you don't know the structure at design time
XElement el = new XElement(elTest);

el.Element("ID").Value = "5678";

//inject new node 
elTest.AddAfterSelf(el);

doc.Save("After.xml");

【讨论】:

  • 感谢您的解决方案,它有效! ;) 但是,如果我没有确切的数字,我该如何搜索 ID?所以我的ID里有一个随机数,怎么才能找到正确的地方呢?
  • 如果您的意思是希望新节点位于底部,那么只需使用Last() 而不是First(d =&gt; d......)。如果您需要搜索一个节点,那么您必须了解所有节点独有的有关它的信息。
猜你喜欢
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多