Я новичок в xpath в C # и пытаюсь выбрать элемент с двумя конкретными значениями.Вот как выглядит формат 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, но это ошибки с «Выражение должно оцениваться в набор узлов».Что заставляет меня думать, что я вычисляю логическое значение, когда использую 'и'.
Есть ли лучший способ сделать это с помощью цикла, в котором выбирается первый элемент и цикл до совпадения второго?Как я уже говорил, у меня нет большого опыта работы с выражениями xpath / xml в C #, возможно, есть лучший способ.Если это помогает, я использую формы Windows и .net 4.0, в этой форме значения портов заполняют представление списка из двух столбцов в подробном представлении.