Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XPATH查询结果不一致_C#_Xpath_Xml Namespaces - Fatal编程技术网

C# XPATH查询结果不一致

C# XPATH查询结果不一致,c#,xpath,xml-namespaces,C#,Xpath,Xml Namespaces,我正在运行一个转换过程来更新一些xml文件。下面是一个示例文件: <?xml version="1.0" encoding="utf-8"?> <Jobs xmlns="urn:mynamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Job name="Job1"> <Ca

我正在运行一个转换过程来更新一些xml文件。下面是一个示例文件:

<?xml version="1.0" encoding="utf-8"?>
<Jobs xmlns="urn:mynamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Job name="Job1">
    <Category>Maintenance</Category>
    <Description>Purge records</Description>
    <Steps>
      <TSql name="Start Job" database="IADS">
        <CommandText>Exec StoredProcedureName</CommandText>
        <OnSuccess action="GotoNextStep" />
        <Retries>0</Retries>
        <OnFailure action="QuitFailure" />
        <OutputFile />
      </TSql>
      <TSql name="Start LoadRequestManagementReportTables" database="msdb">
        <CommandText>exec sp_start_job @job_name = 'Load Request Management Report Tables'</CommandText>
        <OnSuccess action="QuitSuccess" />
        <Retries waitInMinutes="0">0</Retries>
        <OnFailure action="QuitFailure" />
        <OutputFile />
      </TSql>
    </Steps>
    <Schedules>
      <Schedule>
        <Weekly name="Every Sunday at 7:00 AM" enabled="false">
          <BeginDate>2008-11-01</BeginDate>
          <RunTimes>
            <Once>07:00</Once>
          </RunTimes>
          <DaysOfWeek>Sunday</DaysOfWeek>
        </Weekly>
      </Schedule>
      <Schedule>
        <OneTime name="OneTime" enabled="false" rundate="2011-01-12T03:00:00" />
      </Schedule>
    </Schedules>
    <Notifications>
      <EventLog on="Failure" />
    </Notifications>
  </Job>
</Jobs>
我遇到的问题是,我运行的第二个查询没有返回结果

下面是我运行的查询#1:

XmlNodeList stepNodes = xSchedule.SelectNodes("/mns:Jobs/mns:Job/mns:Steps/mns:TSql", nsm);
这非常有效,在我的stepNodes变量中返回2个节点。我处理stepNodes[0]的“重命名节点”方法。太棒了

接下来我要做的事情是删除“RenameNode”方法生成的名称空间属性(我猜你不会喜欢这个……但这不是问题所在)。因此,为了做到这一点,我尝试运行一个非常类似的XPATH查询,如下所示,但它不返回任何记录:

stepNodes = xSchedule.SelectNodes("/mns:Jobs/mns:Job/mns:Steps/mns:CmdExec", nsm);
我尝试过重置名称空间管理器,尝试过保存xml文件(xSchedule.Save()),尝试过运行带有或不带名称空间前缀/参数的查询,等等。它从不返回任何节点。即使在对节点进行重命名之后,在保存文档之后,我也可以看到它成功地重命名了该节点(并因此将xmlns属性添加到新命名节点中的所有内容)。我甚至验证了返回结果的原始查询现在只返回1个节点

// Let's assume that the very first node is the node that we want to change
        XmlNodeList stepNodes = xSchedule.SelectNodes("/mvst:Jobs/mvst:Job/mvst:Steps/mvst:TSql", nsm);
    if (stepNodes.Count >= 1)
    {
        RenameNode(stepNodes[0], String.Empty, "CmdExec");

        // After renaming the node, let's remove the "database" attribute if it exists
        //XmlElement e = (XmlElement)stepNodes[0];
        //e.RemoveAttribute("database");
        xSchedule.Save(scheduleXmlFile + ".bak");
    }

这段代码哪里出错了?

只需将名称空间信息传递给RenameNode方法

RenameNode(stepNodes[0], "urn:mynamespace", "CmdExec");

中间XML是什么样子的,或者如何更改节点。您提示我查看我的“RenameNode”方法,我注意到我通过显式地将名称空间定义为String.Empty而不是实际值来调用该方法。切换这个选项修复了我的疑问。如果有人好奇,我将用重命名方法更新原始问题……那么,您可能已经发现了问题。;)
RenameNode(stepNodes[0], "urn:mynamespace", "CmdExec");