SelectNodes не возвращает дочерние значения

Я новичок в XPath. Я прочитал весь учебник W3Schools. Я хотел бы получить все <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>s, которые соответствуют строке.

2 ответа

Решение

Это потому, что ваш 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

Вы можете использовать следующий код, чтобы найти все элементы расписания.

XmlDocument dom = new XmlDocument(); 
dom.Load(textBoxFilePath.Text);
XmlNodeList jobElements = dom.GetElementsByTagName("schedule");
Другие вопросы по тегам