1

我有节点<EnginesTimesQueues><NumberOfEngines>. 我需要将两个节点的值分别更新为 36 和 ABC。

<job>
  <Step number="3340">
    <Category name="Parameters">
      <Item name="EnginesTimesQueues" commarea="Y">6</Item>
    </Category>
  </Step>

  <Step number="3360">
    <Category name="Parameters">
      <Item name="NumberOfEngines" commarea="Y">2</Item>
    </Category>
  </Step>
</job>

我正在尝试使用以下节点遍历SingleSelectNode()节点:

/Job/Step/Category/Item[@name='EnginesTimesQueues']|/Job/Step/Category/Ite[@commarea='Y']
/Job/Step/Category/Item[@name='NumberOfEngines']|/Job/Step/Category/Item[@commarea='Y']

最初在循环中将 EnginesTimesQueues 值更新为 36,第二次不是将 NumberOfEngines 更新为“ABC”,而是再次将 EnginesTimesQueues 更新为“ABC”。

4

2 回答 2

0

除了方法名称是SelectSingleNode(), notSingleSelectNode()并且 XPath 表达式区分大小写(因此/Job不会匹配 node <job>)这一事实之外:您正在使用联合表达式,这意味着

/Job/Step/Category/Item[@name='NumberOfEngines']|/Job/Step/Category/Item[@commarea='Y']

将匹配属性值为“NumberOfEngines”的<Item>节点以及属性值为“Y”的节点。由于后一个(子)表达式匹配两个节点,并将结果限制为单个项目,因此您将再次获得第一个节点。name <Item>commarea<Item>SelectSingleNode()

如果要同时匹配节点的两个属性,请使用and运算符:

/Job/Step/Category/Item[@name='NumberOfEngines' and @commarea='Y']
于 2017-06-23T13:10:03.367 回答
0

尝试这样的事情。

Select objNodeList = objDoc.DocumentElement.Selectnodes("/Job/Step/")
objNodeList.Item(0).SelectSingleNode("/Category/Item[@name='EnginesTimesQueues']|/Category/Item[@commarea='Y']").Text = "36" 
objNodeList.Item(1).SelectSingleNode("/Category/Item[@name='NumberOfEngines']|/Category/Item[@commarea='Y']").Text = "ABC"

用另一种解决方案更新答案。这个 Xpath 也应该可以工作。试试看。/Job/Step[1]/Category/Item[@name='NumberOfEngines']|/Job/Step[1]/Category/Item[@commarea='Y']

默认情况下,vbscript 会将第一次出现的“Step”视为要遍历的轨迹。我们需要明确指定节点索引来访问特定的索引。

注意:我最后没有运行此代码。您可能需要一些调试。

于 2017-06-23T08:31:56.267 回答