чтение корневого элемента в XML не дочерний - PullRequest
0 голосов
/ 01 июня 2010

Привет, я работаю над приложением, которое читает файл XML. Здесь я пытаюсь прочитать узел «имя» под узлом «а» не под узлом «б» Когда я попытался прочитать корневой узел «имя», я получил оба узла. Пожалуйста, помогите мне решить проблему. Ниже приведен образец.

 <a>    
      <x>rrr</X>
      <b>
        <name> 123 </name>
      </b>
      <name> main </name>
      <c>yyyy</c>
    </a>





    QDomDocument mDocument;
     QDomElement  mDocumentElement;
     if (!mDocument.setContent(file.readAll())) 
     {          
         return ;      
     }      

     mDocumentElement = mDocument.documentElement();
     QDomNodeList list  = mDocumentElement.elementsByTagName("a").at(0).toElement().elementsByTagName("name");

     int count = list.count();
     for (int i = 0; i < count; i++)
     {
      QString str = list.at(i).nodeValue();
      QMessageBox::information(this, "text", str, QMessageBox::Yes, 0);
     }

Ответы [ 2 ]

1 голос
/ 01 июня 2010

Если ваш XML-обход основан на структуре, а не на типе контента, вы можете следовать этому.

QDomDocument mDocument;
QDomElement  mDocumentElement;
if (!mDocument.setContent(file.readAll())) 
{          
    return ;      
}      

mDocumentElement = mDocument.documentElement();
QDomNodeList list = mDocumentElement.childNodes();
QDomElement firstChild = list.at(0).toElement(); // will return the first child
QDomElement secondChild = list.at(1).toElement(); // second child
   ......

Чтобы получить данные, присутствующие между тегами,

QString childData = firstChild.text();

можно использовать. Точно так же Вы можете перемещаться до желаемого значения <name> и его значения. Помните, childNodes () вернет только список прямых потомков. Надеюсь, что все ясно. Это не проверено, но должно работать.

0 голосов
/ 02 июня 2010

Вы можете выполнять итерации по прямым потомкам элемента "a", используя QDomNode :: firstChild (QString tagName) и QDomNode :: nextSiblingElement (QString tagName). Код будет выглядеть так:

QDomDocument mDocument;
if (!mDocument.setContent(file.readAll())) 
{          
    return ;      
}

QDomElement  mElement = mDocument.documentElement().firstChildElement("name");
while ( !mElement.isNull() )
{
    // do all you need to do with <name> element
    mElement = mElement.nextSiblingElement("name");
}

Я тестировал этот код на вашем примере XML, и он работает, если вы исправите несоответствие тега в этой строке: rrr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...