首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获取包含特定文本的特定类型的子节点。

无法获取包含特定文本的特定类型的子节点。
EN

Stack Overflow用户
提问于 2014-10-06 08:19:49
回答 2查看 98关注 0票数 0

使用下面的代码,我可以接收我的Xml中的所有<job>元素。但是,当我试图搜索具有一个名为<Name>的子任务且其文本等于"receiverjob"的作业时,即使作业存在,SelectNodes()方法仍然返回零。

代码语言:javascript
复制
XmlDocument dom = new XmlDocument();
dom.Load(textBoxFilePath.Text);
XmlNamespaceManager nsManager = new XmlNamespaceManager(dom.NameTable);
nsManager.AddNamespace("d", "http://quartznet.sourceforge.net/JobSchedulingData");
XmlNodeList jobElements = dom.DocumentElement.SelectNodes("descendant::d:job[name=receiverjob]", nsManager);

Xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file contains job definitions in schema version 2.0 format -->
<job-scheduling-data version="2.0" xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>
  <schedule>
    <job>
      <name>receiverjob</name>
      <group>receivergroup</group>
      <job-type>Quartz.Server.ArgumentReceiverJob, Quartz.Server</job-type>
      <job-data-map>
        <entry>
          <key>receivedargument</key>
          <value>hamburger</value>
        </entry>
      </job-data-map>
    </job>
    <trigger>
      <simple>
        <name>argumentreceiverJobTrigger</name>
        <group>argumentreceiverGroup</group>
        <description>Simple trigger to simply fire sample job</description>
        <job-name>receiverjob</job-name>
        <job-group>receivergroup</job-group>
        <misfire-instruction>SmartPolicy</misfire-instruction>
        <repeat-count>-1</repeat-count>
        <repeat-interval>10000</repeat-interval>
      </simple>
    </trigger>
    <job>
      <name>batchjob</name>
      <group>batchGroup</group>
      <job-type>Quartz.Server.BatchJob, Quartz.Server</job-type>
      <durable>true</durable>
      <recover>false</recover>
    </job>
    <trigger>
      <cron>
        <name>Trigger2</name>
        <group>DEFAULT</group>
        <job-name>batchjob</job-name>
        <job-group>batchGroup</job-group>
        <cron-expression>0/15 * * * * ?</cron-expression>
      </cron>
    </trigger>
    <job>
      <name>jobnamexxx</name>
    </job>
    <job>
      <name>jobnamexxx</name>
    </job>
    <job>
      <name>jobnamexxx</name>
    </job>
  </schedule>
</job-scheduling-data>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-06 08:23:31

我不是XPath专家,但我怀疑您的查询现在试图找到name元素等于receiverjob元素的作业。我怀疑你想要这样的东西:

代码语言:javascript
复制
"descendant::d:job[name/text()='receiverjob']"

还可能需要将name元素限定在正确的命名空间中:

代码语言:javascript
复制
"descendant::d:job[d:name/text()='receiverjob']"

但是,我会强烈考虑使用LINQ,而不是使用非常简单的LINQ (IMO):

代码语言:javascript
复制
XDocument doc = XDocument.Load(textBoxFilePath.Text);
XNamespace ns = "http://quartznet.sourceforge.net/JobSchedulingData";
var jobs = doc.Descendants(ns + "job")
              .Where(x => (string) x.Element(ns + "name") == "receiverjob");

我不确定XPath语法,但我对LINQ版本很有信心--这本身就是该解决方案好处的标志,IMO。(当然,对于没有使用LINQ的XPath专家来说,情况可能正好相反。)

票数 1
EN

Stack Overflow用户

发布于 2014-10-06 08:27:07

您还需要在name元素上应用前缀,并且需要引用字符串文字:"descendant::d:job[d:name = 'receiverjob']"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26212300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档