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

标签 c# xml xpath selectsinglenode

我是 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 方法中,但出现“表达式必须计算为节点集”的错误。这让我觉得当我使用“and”时我正在评估一个 bool 值。

通过循环执行此操作的更好方法是选择第一个元素并循环直到第二个元素匹配吗?正如我之前所说,我对 C# 中的 xpath/xml 表达式没有太多经验,也许有更好的方法。如果有帮助,我正在使用 Windows 窗体和 .net 4.0,在这种形式中,端口值将填充详细 View 中的两列 ListView 。

最佳答案

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

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

在您的情况下,您正在执行两个集合的并集,其中 Local=19 和另一个集合 Remote=21。

关于C# 使用 XPATH 选择具有已知值的特定元素,然后删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944845/

相关文章:

C# 泛型 - 集合列表

c# - FluentValidation 中依赖规则的顺序

c# - 如何在asp.net web api中检测操作系统、浏览器、设备名称等设备信息?

python - 在scrapy python中使用非类标签进行选择

c# - 解析 xml 中的特定元素值

c# - 根据结果​​在后台 Worker 上重新运行 DoWork?

c# - 如何在 Visual C# 项目中包含 xsd 架构文件?

python - 让外籍人士在 python 中使用 .dtd 进行实体替换

xml - 从 XML 解析日期不起作用

python - 为什么Scrapy在这里找不到href?