c# - Cannot get child nodes of a specific type that contain a specific text -
c# - Cannot get child nodes of a specific type that contain a specific text -
using code below, can receive <job> elements in xml. however, when  seek search jobs have  kid called <name> , text equals "receiverjob", selectnodes() method returns 0 though job exists.
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:
<?xml version="1.0" encoding="utf-8"?> <!-- 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 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>       
i'm not xpath expert, suspect query trying find jobs name element equal receiverjob element. suspect want this:
"descendant::d:job[name/text()='receiverjob']"    it's possible need qualify name element in right namespace:
"descendant::d:job[d:name/text()='receiverjob']"    i strongly consider using linq xml instead, however, simple (imo):
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");    i'm uncertain xpath syntax, i'm confident linq xml version - in mark of benefit of solution, imo. (of course, xpath expert hadn't used linq xml, opposite might true.)
 c# .net xml xpath 
 
  
Comments
Post a Comment