我有一个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的情况下实现这一目标?怎么做?
了解单斜线/和双斜线的使用//可以在这里提供帮助.
让我们看看/与//根节点有关的工作方式和工作方式.何时/在路径的开头使用:
/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. [单斜线/]
如果您只是想查找单个节点的“下一个”或“上一个”迭代,您可以执行以下操作,然后将其与名称进行比较
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)
| 归档时间: |
|
| 查看次数: |
29677 次 |
| 最近记录: |