C# 使用 XPATH 选择具有已知值的特定元素,然后删除

本文关键字:元素 删除 然后 XPATH 使用 选择 | 更新日期: 2023-09-27 17:55:59

我是 C# 中的 xpath 新手,我正在尝试选择一个具有两个特定值的元素。这是 XML 格式的样子

<?xml version="1.0" encoding="utf-8"?>
<Manager>
  <SSH>
    <Tunnels>
      <Port>
        <Local>443</Local>
        <Remote>443</Remote>
      </Port>
      <Port>
        <Local>5432</Local>
        <Remote>5432</Remote>
      </Port>
      <Port>
        <Local>19</Local>
        <Remote>21</Remote>
      </Port>
      <Port>
        <Local>19</Local>
        <Remote>22</Remote>
      </Port>
    </Tunnels>
  </SSH>
</Manager>

我试图选择一个具有先前表单值的"端口",以便我可以从 xml 中删除该特定条目。这是我使用的代码:

        //remove children from selected
        XmlNode _xmlTunnel = _xml.SelectSingleNode("/Manager/SSH/Tunnels/Port[Local=" + _local + "] | /Manager/SSH/Tunnels/Port[Remote=" + _remote + "]");
        MessageBox.Show("Local " + sshList.SelectedItems[0].Text + " Remote " + sshList.SelectedItems[0].SubItems[1].Text +"'n'n" + _xmlTunnel.InnerText);
        _xmlTunnel.RemoveAll();
        //remove all empties
        XmlNodeList emptyElements = _xml.SelectNodes(@"//*[not(node())]");
        for (int i = emptyElements.Count -1; i >= 0; i--) {
        emptyElements[ i ].ParentNode.RemoveChild(emptyElements[ i ]); }

这段代码工作正常,直到我有两个具有相同本地值的端口。它总是选择它遇到的第一个元素(即 Local=19 和 Remote=21,即使您尝试选择 Local=19 和 Remote=22 的节点)。我尝试在 SelectSingleNode 方法中将 xpath 表达式切换为"and"而不是"|",但错误为"表达式必须计算为节点集"。这让我觉得当我使用"and"时,我正在评估布尔值。

通过循环

选择第一个元素并循环直到第二个元素匹配,是否有更好的方法?正如我之前所说,我对 C# 中的 xpath/xml 表达式没有太多经验,也许有更好的方法。如果它有帮助我正在使用 Windows 表单和 .net 4.0,则在此表单中,端口值填充详细信息视图中的两列列表视图。

C# 使用 XPATH 选择具有已知值的特定元素,然后删除

您需要

在端口节点上"和"2个条件,例如:

"/Manager/SSH/Tunnels/Port[Local=" + _local + " and  Remote=" + _remote + "]"

在您的情况下,您正在执行 2 组的联合,其中本地 = 19 和另一个集合,其中远程 = 21。