Попытка использовать RemoveChild () на XmlNodeList испортила мою коллекцию XmlNode - PullRequest
0 голосов
/ 23 марта 2010

Я пытаюсь удалить определенный узел из списка XmlNodeList с именем listaWidths.Этот конкретный список имеет 5 пунктов, прежде чем я использую RemoveChild ().Но после оператора RemoveChild () список остается только с 1 элементом.

XmlNodeList listaWidths = xmlDoc.SelectNodes("/MsBuild:Report/MsBuild:Body/MsBuild:ReportItems/MsBuild:Tablix/MsBuild:TablixBody/MsBuild:TablixColumns/*", nsmgr);                
int indexEpoca = 0;
XmlNode node = listaWidths[indexEpoca];
XmlNode parent = listaWidths[indexEpoca].ParentNode;
parent.RemoveChild(node);

Это XML RDL Reporting Services.Конкретный код XML здесь:

  <Tablix Name="Tablix3">
    <TablixBody>
      <TablixColumns>
        <TablixColumn>
          <Width>1.602in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.61in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6323in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6023in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6033in</Width>
        </TablixColumn>
      </TablixColumns>
      (...)

Я перепробовал все возможные комбинации, но безуспешно.Что я делаю неправильно?Спасибо.

1 Ответ

1 голос
/ 23 марта 2010

В документации SelectNodes четко сказано: «Объект XmlNodeList, возвращаемый этим методом, будет действительным, пока базовый документ остается неизменным. Если базовый документ изменяется, могут возвращаться непредвиденные результаты (исключений не будет) выброшен). "

Так что то, что вы испытываете с вашим XmlNodeList, возвращаемым из SelectNodes после того, как вы манипулируете документом, может не соответствовать вашим ожиданиям, а соответствует документации. Вам придется снова вызывать SelectNodes, чтобы получить новый XmlNodeList, если вы манипулируете документом.

На мой взгляд, разработчики реализации DOM в .NET Framework допустили ошибку, используя XmlNodeList в качестве абстрактного класса для конкретной реализации с совершенно другим поведением. Если вы используете, например, Затем ChildNodes вы получаете «живой» список узлов в соответствии с требованиями спецификации W3C DOM, поэтому в этом случае изменение документа автоматически изменяет список узлов (при необходимости). Однако SelectNodes возвращает список узлов с совершенно другим поведением, как вы уже видели.

...