C# LINQ到XML:如何访问子节点

C# LINQ到XML:如何访问子节点,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我是LinqtoXML新手,非常感谢您帮助我访问子节点 XML文档: <schedule> <job> <name>nativeJobExample</name> <group>nativeJobExampleGroup</group> <description>Sample job for Quartz Server</description> <

我是LinqtoXML新手,非常感谢您帮助我访问子节点

XML文档:

    <schedule>
    <job>
    <name>nativeJobExample</name>
    <group>nativeJobExampleGroup</group>
    <description>Sample job for Quartz Server</description>
    <job-type>Quartz.Job.NativeJob, Quartz</job-type>
    <job-data-map>
      <entry>
        <key>command</key>
        <value>native_job_example.bat</value>
      </entry>
      <entry>
        <key>consumeStreams</key>
        <value>true</value>
      </entry>
    </job-data-map>
  </job>
  <trigger>
    <simple>
      <name>nativeJobExampleSimpleTrigger</name>
      <group>nativeJobExampleSimpleTriggerGroup</group>
      <description>Simple trigger to simply fire sample job</description>
      <job-name>nativeJobExample</job-name>
      <job-group>nativeJobExampleGroup</job-group>
      <misfire-instruction>SmartPolicy</misfire-instruction>
      <repeat-count>5</repeat-count>
      <repeat-interval>10000</repeat-interval>
    </simple>
  </trigger>
</schedule>
XML文档包含多对作业和触发器

关于如何更新值的两个问题:

  • 如何获取职务数据映射|输入|键|值

  • 如何触发|简单|名称|重复计数


  • 有多种方法可以做到这一点,最简单的方法是使用XPathSelectElements,如下所示:

    XDocument document = XDocument.Load(@pmPathFileName);
    XElement root = document.Root;
    root.Elements("job").Where(e => e.Element("name").Value.Equals("nativeJobExample")).
    Select(e => e.Element("description")).Single().SetValue("wwww");
    
            string key = "consumeStreams";
            string newValue = "false";
            var val1 = (
                           from jdm in document.Root.
                                                Elements("job").
                                                Elements("job-data-map").
                                                Elements("entry")
                           where jdm.Element("key") != null && jdm.Element("key").Value == key
                           select jdm.Element("value")
                       ).Single();
    
            val1.SetValue(newValue);
    

    var key=root.XPathSelectElements(“/schedule/job/job-data-map/entry/key”)

    有多种方法可以做到这一点,最简单的方法是使用XPathSelectElements,如下所示:

    XDocument document = XDocument.Load(@pmPathFileName);
    XElement root = document.Root;
    root.Elements("job").Where(e => e.Element("name").Value.Equals("nativeJobExample")).
    Select(e => e.Element("description")).Single().SetValue("wwww");
    
            string key = "consumeStreams";
            string newValue = "false";
            var val1 = (
                           from jdm in document.Root.
                                                Elements("job").
                                                Elements("job-data-map").
                                                Elements("entry")
                           where jdm.Element("key") != null && jdm.Element("key").Value == key
                           select jdm.Element("value")
                       ).Single();
    
            val1.SetValue(newValue);
    

    var key=root.XPathSelectElements(“/schedule/job/job-data-map/entry/key”)

    正如我在第一个案例中所理解的那样,您希望更新与之匹配的特定元素。您可以这样做:

    XDocument document = XDocument.Load(@pmPathFileName);
    XElement root = document.Root;
    root.Elements("job").Where(e => e.Element("name").Value.Equals("nativeJobExample")).
    Select(e => e.Element("description")).Single().SetValue("wwww");
    
            string key = "consumeStreams";
            string newValue = "false";
            var val1 = (
                           from jdm in document.Root.
                                                Elements("job").
                                                Elements("job-data-map").
                                                Elements("entry")
                           where jdm.Element("key") != null && jdm.Element("key").Value == key
                           select jdm.Element("value")
                       ).Single();
    
            val1.SetValue(newValue);
    
    至于第二个案例。我宁愿使用更简洁的XPath语法,因为不需要匹配(从XML结构来看,我觉得只能有一个元素)


    正如我在第一个案例中所理解的,您希望更新与之匹配的特定元素。您可以这样做:

    XDocument document = XDocument.Load(@pmPathFileName);
    XElement root = document.Root;
    root.Elements("job").Where(e => e.Element("name").Value.Equals("nativeJobExample")).
    Select(e => e.Element("description")).Single().SetValue("wwww");
    
            string key = "consumeStreams";
            string newValue = "false";
            var val1 = (
                           from jdm in document.Root.
                                                Elements("job").
                                                Elements("job-data-map").
                                                Elements("entry")
                           where jdm.Element("key") != null && jdm.Element("key").Value == key
                           select jdm.Element("value")
                       ).Single();
    
            val1.SetValue(newValue);
    
    至于第二个案例。我宁愿使用更简洁的XPath语法,因为不需要匹配(从XML结构来看,我觉得只能有一个元素)


    谢谢你的密码。由于存在多个作业/触发器对,我对code.string key=“consumerstreams”做了一个小改动;字符串newValue=“true”;var val1=(来自document.Root.Elements(“作业”)中的jdm。其中(e=>e.Element(“name”).Value.Equals(“nativeJobExample2”)……字符串newValue2=“2000”;var val2=(来自document.Root.Elements(“触发器”).Elements(“简单”).Where(e=>e.Element(“name”).Value.Equals(“nativeJobExampleSimpleTrigger2”))中的jdm2,其中jdm2.Element(“重复计数”)!=null选择jdm2.Element(“重复计数”).Single();val2.SetValue(newValue2);很高兴它对您有所帮助。祝您愉快。:-)谢谢你的代码。因为有多个作业/触发器对,所以我对code.string key=“consumerstreams”;string newValue=“true”var val1=(来自document.Root.Elements(“作业”)中的jdm)。其中(e=>e.Element(“名称”).Value.Equals(“nativeJobExample2”)……字符串newValue2=“2000”;var val2=(来自document.Root.Elements(“触发器”).Elements(“简单”)中的jdm2。其中(e=>e.Element(“名称”).Value.Equals(“nativeJobExampleSimpleTrigger2”))其中jdm2.Element(“repeat count”)!=null选择jdm2.Element(“repeat count”)).Single();val2.SetValue(newValue2);很高兴它对您有所帮助。祝您愉快。:-)