gpt4 book ai didi

c# - 如何以编程方式将 XmlNode 添加到 XmlNodeList

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:26 25 4
gpt4 key购买 nike

我有一个产品的 XmlNodeList,其值被放入表中。现在,我想在找到某个产品时向列表中添加一个新的 XmlNode,以便在同一循环中,新产品的处理方式与文件中最初的项目相同。这样函数的结构不需要改变,只需添加一个额外的接下来要处理的节点。但是 XmlNode 是一个抽象类,我不知道如何以编程方式创建新节点。这可能吗?

XmlNodeList list = productsXml.SelectNodes("/portfolio/products/product");

for (int i = 0; i < list.Count; i++)
{
XmlNode node = list[i];

if (node.Attributes["name"].InnertText.StartsWith("PB_"))
{
XmlNode newNode = ????
list.InsertAfter(???, node);
}

insertIntoTable(node);
}

最佳答案

XmlDocument 是其节点的工厂,因此您必须这样做:

XmlNode newNode = document.CreateNode(XmlNodeType.Element, "product", "");

或者它的快捷方式:

XmlNode newNode = document.CreateElement("product");

然后将新创建的节点添加到其父节点:

node.ParentNode.AppendChild(newNode);

如果必须处理添加的节点,那么您必须明确地执行此操作:节点列表是与搜索条件匹配的节点的快照,因此它不会动态更新。只需为添加的节点调用 insertIntoTable():

insertIntoTable(node.ParentNode.AppendChild(newNode));

如果您的代码有很大不同,您可能需要进行一些重构以使该过程成为两步批处理(首先搜索要添加的节点,然后处理所有节点)。当然,您甚至可以采用完全不同的方法(例如,将节点从 XmlNodeList 复制到一个列表,然后将它们添加到两个列表中)。

假设这就足够了(并且您不需要重构)让我们将所有内容放在一起:

foreach (var node in productsXml.SelectNodes("/portfolio/products/product"))
{
if (node.Attributes["name"].InnertText.StartsWith("PB_"))
{
XmlNode newNode = document.CreateElement("product");
insertIntoTable(node.ParentNode.AppendChild(newNode));
}

// Move this before previous IF in case it must be processed
// before added node
insertIntoTable(node);
}

重构

重构时间(如果你有一个 200 行的函数,你真的需要它,比我在这里展示的要多得多)。第一种方法,即使不是很有效:

var list = productsXml
.SelectNodes("/portfolio/products/product")
.Cast<XmlNode>();
.Where(x.Attributes["name"].InnertText.StartsWith("PB_"));

foreach (var node in list)
node.ParentNode.AppendChild(document.CreateElement("product"));

foreach (var node in productsXml.SelectNodes("/portfolio/products/product"))
insertIntoTable(node); // Or your real code

如果您不喜欢两次通过的方法,您可以像这样使用 ToList():

var list = productsXml
.SelectNodes("/portfolio/products/product")
.Cast<XmlNode>()
.ToList();

for (int i=0; i < list.Count; ++i)
{
var node = list[i];

if (node.Attributes["name"].InnertText.StartsWith("PB_"))
list.Add(node.ParentNode.AppendChild(document.CreateElement("product"))));

insertIntoTable(node);
}

请注意,在第二个示例中,必须使用 for 而不是 foreach,因为您在循环中更改了集合。请注意,您甚至可以保留原始的 XmlNodeList 对象......

关于c# - 如何以编程方式将 XmlNode 添加到 XmlNodeList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808150/

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