【发布时间】:2021-11-20 07:14:37
【问题描述】:
我正在尝试将加载的 XML 的不同子节点(不是从根开始)的所有列表获取到字符串列表中,我已经使用 System.Xml 库完成了,但我想编写相同的代码LINQ to XML 也是。 我找到了一个对我帮助很大的代码,但它是从 Root 开始的,代码如下:
List<string> nodesNames = new List<string>();
XDocument xdoc1 = XDocument.Load(destinationPath);
XElement root = xdoc1.Document.Root;
foreach (var name in root.DescendantNodes().OfType<XElement>()
.Select(x => x.Name).Distinct())
{
if (!nodesNames.Contains(name.ToString()))
nodesNames.Add(name.ToString());
}
有了这个,我也得到了所有子节点 + 父节点的列表,我不想使用它。FirstChild 或从列表中手动删除,因为我想要一个完全动态的代码并且我输入了用户传递的父节点。
为了更好地理解,这是对我有用但使用 System.Xml 的代码:
List<string> nodesNames = new List<string>();
XmlDocument doc = new XmlDocument();
doc.Load(destinationPath);
XmlNodeList elemList = doc.GetElementsByTagName(inputParentNode);
for (int i = 0; i < elemList.Count; i++)
{
XmlNodeList cnList = (elemList[i].ChildNodes);
for (int j = 0; j < cnList.Count; j++)
{
string name = cnList[j].Name;
if (!nodesNames.Contains(name))
nodesNames.Add(name);
}
}
这是一个简单的 XML 示例:
<?xml version='1.0' encoding='UTF-8'?>
<parentlist>
<parent>
<firstchild>someValue</firstchild>
<secondchild>someValue</secondchild>
</parent>
<parent>
<firstchild>someValue</firstchild>
<secondchild>someValue</secondchild>
<thirdchild>someValue</thirdchild>
</parent>
</parentlist>
继续:
- 在第一种情况下,我获得了 nodesNames = ["parent", "firstchild", "secondchild", "thirdchild"]
- 在第二种情况下,我获得了 nodesNames = ["firstchild", "secondchild", "thirdchild"]
我只想修复第一个以获得与第二个相同的结果。
【问题讨论】:
标签: c# xml linq-to-xml xelement descendant