2014-10-03 83 views
0

我是XPath新手。我讀了整個W3Schools tutorial。我想獲得我文檔的所有<schedule>節點。我可以讓我的文檔的所有子元素與child::*但只要我添加<schedule>像下面,我得到結果爲零:SelectNodes不返回子值

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> 

我會最終想要實現的是獲得與字符串匹配的<job>的所有<name>

回答

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

+0

第4行,當你添加命名空間拋出一個'NullReferenceException'。 – Disasterkid 2014-10-03 13:38:38

+0

嘗試使用另一種方式註冊前綴:nsManager.AddNamespace(「d」,「http://quartznet.sourceforge.net/JobSchedulingData」);(儘管代碼對我來說很像,但請參閱小提琴演示) – har07 2014-10-03 13:41:14

0

您可以使用以下代碼查找所有計劃元素。

XmlDocument dom = new XmlDocument(); 
dom.Load(textBoxFilePath.Text); 
XmlNodeList jobElements = dom.GetElementsByTagName("schedule"); 
+0

這正是我所做的,我從中得不到什麼。 – Disasterkid 2014-10-03 13:26:45

+0

我錯過了有一個默認的命名空間。 http://stackoverflow.com/a/26179849/15526是正確的答案。 – Steve 2014-10-03 13:30:13

+0

我編輯了我的代碼來處理命名空間。它現在的作品 – Steve 2014-10-03 13:35:08