2011-05-10 84 views
3

我是C#中xpath的新手,我嘗試選擇具有兩個特定值的元素。這是XML格式的樣子C#使用XPATH選擇具有已知值的特定元素,然後刪除

<?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方法中,但用「Expression必須評估爲節點集」出錯。這讓我認爲我在使用'和'時正在評估布爾值。

更好的方法是通過循環來做到這一點,其中選擇第一個元素和循環,直到第二個匹配?正如我之前所說的,我對C#中的xpath/xml表達式沒有多少經驗,也許有更好的方法。如果它有幫助,我正在使用windows窗體和.net 4.0,在這種形式下,端口值在詳細視圖中填充兩列列表視圖。

回答

3

你需要「和」端口2分的條件節點,如:

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

在你的情況,你正在做的2套,其中本地= 19而另一種遠程= 21集。

+0

完美的作品,我希望我親近,謝謝! – FeatherKing 2011-05-10 04:15:04

相關問題