C # Использование XPATH, чтобы выбрать конкретный элемент с известными значениями, а затем удалить - PullRequest
3 голосов
/ 10 мая 2011

Я новичок в 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, в этой форме значения портов заполняют представление списка из двух столбцов в подробном представлении.

1 Ответ

3 голосов
/ 10 мая 2011

Вам необходимо "и" 2 условия на узле порта, например:

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

В вашем случае вы выполняете объединение 2 наборов, где Local = 19, и другого, где Remote = 21.

...