编程语言
首页 > 编程语言> > C#使用XPATH选择具有已知值的特定元素,然后删除

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

作者:互联网

我是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,则在此窗体中,端口值将填充详细视图中的两列列表视图.

解决方法:

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

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

在您的情况下,您要进行2组联合,其中Local = 19,而另一组Remote = 21.

标签:xpath,selectsinglenode,xml,c
来源: https://codeday.me/bug/20191208/2091397.html