我有一个看起来像这样的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/