[英]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.