SelectNodes不返回子值

时间:2014-10-03 13:16:02

标签: c# xml xpath default-namespace

我是XPath的新手。我读了整个W3Schools tutorial。我想得到我的文档的所有<schedule>个节点。我可以使用child::*获取文档的所有子元素,但是只要我添加<schedule>,就像下面这样,我得到零结果:

XmlDocument dom = new XmlDocument(); 
dom.Load(textBoxFilePath.Text);
XmlNodeList jobElements = dom.DocumentElement.SelectNodes("child::schedule");

这是我的xml:

<?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>
  </schedule>
</job-scheduling-data>

我最终希望获得的是<name>匹配字符串的所有<job>

2 个答案:

答案 0 :(得分:3)

那是因为您的XML具有默认命名空间:

xmlns="http://quartznet.sourceforge.net/JobSchedulingData"

注册指向默认命名空间的前缀,然后使用该前缀和元素的本地名称来引用命名空间中的元素:

XmlDocument dom = new XmlDocument(); 
dom.Load(textBoxFilePath.Text);
XmlNamespaceManager nsManager = new XmlNamespaceManager(dom.NameTable);
nsManager.AddNamespace("d", dom.DocumentElement.NamespaceURI);
XmlNodeList jobElements = dom.DocumentElement.SelectNodes("child::d:schedule", nsManager);

<强> .NET fiddle demo

答案 1 :(得分:0)

您可以使用以下代码查找所有计划元素。

XmlDocument dom = new XmlDocument(); 
dom.Load(textBoxFilePath.Text);
XmlNodeList jobElements = dom.GetElementsByTagName("schedule");
相关问题