gpt4 book ai didi

c# - 在 XML C# 中第一次出现后更改子节点名称的值

转载 作者:行者123 更新时间:2023-11-30 21:34:23 25 4
gpt4 key购买 nike

我有一个看起来像这样的 XML,

<Names>
<Name>
<FName>Abc</FName>
<LName>XYZ</LName>
</Name>
<Name>
<FName>Abc2</FName>
<LName>XYZ2</LName>
</Name>
<Name>
<FName>Abc3</FName>
<LName>XYZ3</LName>
</Name>
<Name>
<FName>Abc4</FName>
<LName>XYZ4</LName>
</Name>
</Names>

如果节点名称不止一次出现并且第一个节点除外,我将尝试在 C# 中预先更改节点名称。第一个节点名称保持不变;

处理后的 XML 应该是这样的;

<Names>
<Name> // kepp first node name same
<FName>Abc</FName>
<LName>XYZ</LName>
</Name>
<ChildName> //changed
<FName>Abc2</FName>
<LName>XYZ2</LName>
</ChildName>
<ChildName> //changed
<FName>Abc3</FName>
<LName>XYZ3</LName>
</ChildName>
<ChildName> // changed
<FName>Abc4</FName>
<LName>XYZ4</LName>
</ChildName>
</Names>

Name的节点可以是一个,如果是一次就保持不变,如果不止一个留第一个,改其他的名字。

我正在尝试这个 XML 对象属于 IEnumerable<XElement>类型;

//check if NAME node occurs multiple times, make other to child.
var nameCounts = element.Descendants().Where(x => x.Name.LocalName == "Name");
int number = nameCounts.Count();
if (number > 1) // if occurance more than one
{
foreach (var e in element.Descendants().Where(x => x.Name.LocalName == "Name").ToList())
{
//e.NodesAfterSelf();
// unable to understand what to do
}
}

更新:

但是我得到了问题的答案;我犯了一个小错误,实际上我的 XML 看起来像这样;

<ListOfNames>
<Names>
<Name> // two occurrence, 2nd will change to CHILD NAME
<FName>Abc</FName>
<LName>XYZ</LName>
</Name>
<Name>
<FName>Abc2</FName>
<LName>XYZ2</LName>
</Name>
</Names>
<Names> // three occurrence, 2nd and 3rd will change to CHILDNAME
<Name>
<FName>Abc</FName>
<LName>XYZ</LName>
</Name>
<Name>
<FName>Abc2</FName>
<LName>XYZ2</LName>
</Name>
<Name>
<FName>Abc2</FName>
<LName>XYZ2</LName>
</Name>
</Names>
<Names> // only one occurrence, nothing change
<Name>
<FName>Abc</FName>
<LName>XYZ</LName>
</Name>
</Names>
</ListOfNames>

最佳答案

它比您目前制作的要简单。您需要做的就是跳过第一个 Name 元素,然后更改其余元素的名称。要处理多个 Names 元素,只需找到每个带有 doc.Descendants("Names") 的元素并处理该容器中的元素即可。

下面是执行此操作的代码:

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

public class Test
{
public static void Main(string[] args)
{
var doc = XDocument.Load("test.xml");

// Handle each Names element separately
foreach (var container in doc.Descendants("Names"))
{
// Within a names element, find all the Name elements,
// and materialize the query. (That may not be necessary; see later.)
var names = container.Elements("Name").ToList();

// Skip the first name, but modify each of the rest.
foreach (var element in names.Skip(1))
{
element.Name = "ChildName";
}
}
Console.WriteLine(doc);
}
}

ToList() 调用可能 不是必需的。 LINQ to XML 在迭代查询时对文档所做的更改是否有问题方面并不是非常清楚(无论如何对我而言)。我确实见过这样的情况,我希望它不会有问题,但它确实会导致问题 - 反之亦然。如果您知道您的文档足够小以至于具体化结果实际上不会造成问题,我通常会这样做只是为了避免进一步调查。

关于c# - 在 XML C# 中第一次出现后更改子节点名称的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50268026/

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