如何在不知道其级别的情况下获取具有相同名称的所有XML节点?

Raf*_*ças 7 c# xml .net-3.0

我有一个XML示例:

<Fruits>
    <Red_fruits>
        <Red_fruits></Red_fruits>
    </Red_fruits>
    <Yellow_fruits>
        <banana></banana>
    </Yellow_fruits>
    <Red_fruits>
        <Red_fruits></Red_fruits>
    </Red_fruits>
</Fruits>
Run Code Online (Sandbox Code Playgroud)

我有4个Red_fruits标签,其中2个共享相同的ParentNode(Fruits),我想获得具有相同ParentNode的那些.

但我只想要那些具有相同名称的(Red_fruits),这意味着不包括Yellow_fruits标签.

这就是我现在使用C#语言做的方式:

XmlDocument doc = new XmlDocument();
string selectedTag = cmbX.text;

if (File.Exists(txtFile.text))
{
    try
    {
        //Load
        doc.Load(cmbFile.text);

        //Select Nodes
        XmlNodeList selectedNodeList = doc.SelectNodes(".//" + selectedTag);
    }
    Catch
    {
        MessageBox.show("Some error message here");
    } 
 }
Run Code Online (Sandbox Code Playgroud)

这让我回到了所有red_fruits,而不仅仅是属于Fruits的那些.

我不能制作XmlNodeList = doc.SelectNodes("/ Fruits/Red_fruits"),因为我想使用这段代码来读取随机的XML文件,所以我不知道具体节点的确切名称,我只需要使用C#语言将具有相同名称和相同级别的所有节点放入XmlNodeList中.

有没有办法在不使用LINQ的情况下实现这一目标?怎么做?

R.C*_*R.C 8

了解单斜线/和双斜线的使用//可以在这里提供帮助.

让我们看看/与//根节点有关的工作方式和工作方式.何时/在路径的开头使用:

/a
Run Code Online (Sandbox Code Playgroud)

它将定义节点a相对于根的绝对路径.因此,在这种情况下,它只会a在XML树的根目录中找到节点.

何时//在路径的开头使用:

//a
Run Code Online (Sandbox Code Playgroud)

它将a在XML文档中的任何位置定义节点的路径.因此,在这种情况下,它将找到a位于XML树内任何深度的节点.

这些XPath表达式也可以在XPath值的中间使用,以定义祖先 - 后代关系.何时/在路径中间使用:

/a/b
Run Code Online (Sandbox Code Playgroud)

它将定义节点的路径,该节点b是节点的直接后代(即子节点)a.

在//路径中间使用时:

/a//b
Run Code Online (Sandbox Code Playgroud)

它将定义节点的路径,该节点b是节点的任何后代a.

回到你的问题:

//使用GetElementsByTagName()返回名称为Red_Fruits的所有元素

XmlDocument doc = new XmlDocument();
XmlNodeList nodes= doc.GetElementsByTagName("Red_Fruits"); 
Run Code Online (Sandbox Code Playgroud)

//使用SelectNodes()方法

XmlNodelist nodes = doc.SelectNodes("//Fruits/Red_Fruits"); 
Run Code Online (Sandbox Code Playgroud)

//这将选择元素子元素的所有元素<Fruits>.

如果<Fruits>是根元素使用Xpath : /Fruits/Red_Fruits. [单斜线/]


Sam*_*ica 3

如果您只是想查找单个节点的“下一个”或“上一个”迭代,您可以执行以下操作,然后将其与名称进行比较

XmlNode current = doc.SelectSingleNode("Fruits").SelectSingleNode("Red_fruits");

XmlNode previous = current.NextSibling;
XmlNode next = current.NextSibling;
Run Code Online (Sandbox Code Playgroud)

你可以迭代直到找到合适的兄弟姐妹

while(next.Name != current.Name)
{
    next = next.NextSibling;
}
Run Code Online (Sandbox Code Playgroud)

或者您甚至可以通过调用“Parent”属性来获取列表

XmlNodeList list = current.ParentNode.SelectNodes(current.Name);
Run Code Online (Sandbox Code Playgroud)