繁体   English   中英

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

[英]C# Using XPATH to select specific element with known values, then delete

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

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

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

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

在你的情况下,你正在做2组的联合,其中Local = 19,另一组是Remote = 21。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM