удаление ненужных узлов с помощью xerces-c - PullRequest
0 голосов
/ 27 января 2012

я использую xerces 2.8.0. Я хочу удалить узлы комментариев из документа.

List = root->getChildNodes();
int count = List->getLength();
int i = 0;
while (i < count)
{
    DOMNode* node = List->item(i);
    if(node != 0 && node->getNodeType() == DOMNode::COMMENT_NODE)
    {
         cout<<"comment node found"<<endl;
         root->removeChild(node);
    }
    i++;
 }

этот код работает нормально, если мой ввод имеет следующий формат:

 <?xml version="1.0"?>
 <root><!-- comment --><node1>txt</node1></root>

Но это не работает, если входной файл имеет "красивый" формат, подобный этому:

 <?xml version="1.0"?>
 <root>
      <!-- comment -->
      <node1>txt</node1>
 </root>

Может кто-нибудь сказать мне, почему?

1 Ответ

1 голос
/ 29 января 2012

Полагаю, две вещи не работают должным образом в вашем цикле.

  1. Если вы удалите дочерний узел из родительского, позиции остальных элементов также изменятся. Поэтому в этом случае не следует увеличивать i, чтобы не пропустить следующий элемент.

  2. Также значение переменной count фактически больше не действует, так как количество дочерних элементов изменилось. Это не имеет большого значения, потому что вы проверяете node перед его использованием, но вы, возможно, звоните List-item(i) с i вне диапазона. Кроме того, вы можете сохранить некоторые вызовы, и это увеличит производительность, особенно для больших файлов, если у них много комментариев.

...