3

我是 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 的节点)。我尝试将 xpath 表达式切换为 'and' 而不是 '|' 在 SelectSingleNode 方法中,但出现“表达式必须评估为节点集”的错误。这让我觉得当我使用“和”时我正在评估一个布尔值。

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

4

1 回答 1

3

您需要“和”端口节点上的 2 个条件,例如:

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

在您的情况下,您正在执行 2 组本地 = 19 和远程 = 21 的联合。

于 2011-05-10T03:54:28.937 回答