在C#中正确使用XmlNode.SelectSingleNode(string xpath)是什么?

Gir*_*rdi 20 c# xml xpath .net-3.5

我在处理一些XML文件时遇到了麻烦(这篇文章末尾).

我编写了以下代码,以获取Job_Id与给定Job_Name模式相关的数据,该模式的所有者Job_Owner是运行probram的用户:

List<String> jobID = new List<String>();
XmlNodeList nodes = xml.SelectNodes("//Job");
foreach (XmlNode node in nodes)
{
    innerNode = node.SelectSingleNode("//Job_Owner"); // SelectSingleNode here always selects the same node, but I thought it should be relative to node, not to nodes
    if (!innerNode.InnerText.Contains(Environment.UserName))
    {
        continue;
    }
    innerNode = node.SelectSingleNode("//Job_Name");
    if (!Regex.IsMatch(innerNode.InnerText, jobNamePattern, RegexOptions.Compiled))
    {
        continue;
    }
    innerNode = node.SelectSingleNode("//Job_Id");
    jobID.Add(innerNode.InnerText);
}
Run Code Online (Sandbox Code Playgroud)

我希望node.SelectSingleNode("//Job_Name")寻找一个Job_Name仅以xml代码命名的标签node.

这不是它似乎发生的事情,因为它总是返回相同的节点,无论它在哪一步都无关紧要foreach(即nodenodes变化中选择,但node.SelectSingleNode("//Job_Name")总是返回相同的内容).

这段代码有什么问题?

提前致谢!

-

XML文件如下所示:

<Data>
    <Job>
        <Job_Id>58282.minerva</Job_Id>
        <Job_Name>sb_net4_L20_sType1</Job_Name>
        <Job_Owner>mgirardis@minerva</Job_Owner>
        <!--more tags-->
    </Job>
    <Job>
        <!--etc etc etc-->
    </Job>
    <!--etc etc etc-->
</Data>
Run Code Online (Sandbox Code Playgroud)

小智 23

这是因为你在XPath中使用'//'语法.该特定语法选择名为that的文档中的第一个节点.尝试查看https://www.w3schools.com/xml/xpath_syntax.asp以获取有关XPath语法的信息.

如果您正在寻找子节点,请尝试使用节点名称(IE:'Job_Owner'而不是'// Job_Owner')

  • 嗯,这工作......我知道这个语法,但是如果`node`不包含所有文档,那么这个语法不会搜索所有文档,而只搜索由`表示的代码内部,这听起来是合理的. node` (2认同)

Mat*_*hen 18

Infernex87是正确的,Job_Owner对于这种情况来说简单有效.但是,如果它不是直接的孩子,你可以这样做:

.//Job_Owner
Run Code Online (Sandbox Code Playgroud)

就像目录一样,.是当前节点,因此这会找到当前节点的后代,而不是文档的根.

  • 我认为应该明确地说(而不仅仅是暗示)方法SelectNodes()和SelectSingleNode()可以访问整个XML文档,并且需要锚定“ ./”才能正常工作。使用“ ./Job_Owner”在当前上下文位置进行植根。 (2认同)