2014-08-07 3 views
0

Привет, у меня есть другой вопрос. Программе необходимо прочитать xml-файл, поместить блок и тестовые разделы в виджет qtree с иерархией деревьев. Пока я могу написать нужные разделы в qtreewidget и написать шаги тестирования при нажатии на элемент. Но так как я не знаю, как сделать поиск в tinyxml, мой код всегда записывает элементы первого шага.Как найти узел в tinyxml? [Qt, C++]

Вот пример моего xml-файла;

<?xml version="1.0"?> 
     <TestLab> 
      <Units> 
       <Unit name="UTB_C" > 
        <communicationinterfaces> 
         <Interface type="UDP" ip="192.168.1.51" port="7000"/> 
        </communicationinterfaces> 
        <Tests> 
         <Test no="1" name="GPIO_3"> 
          <Step no="1" name="step1" >       
          </Step> 
          <Step no="2"name="step2">      
          </Step> 
         </Test> 
        </Tests> 
       </Unit> 
      <Units> 
       <Unit name="UTB_C" > 
        <communicationinterfaces> 
         <Interface type="UDP" ip="192.168.1.51" port="7000"/> 
        </communicationinterfaces> 
        <Tests> 
         <Test no="1" name="GPIO_3"> 
          <Step no="1" name="step1" >       
          </Step> 
          <Step no="2"name="step2">      
          </Step> 
         </Test> 
        </Tests> 
       </Unit> 
      </Units> 
     </TestLab> 

И этот код, который я использую, чтобы показать шаги;

while(step) 
{ 
    QString strStep; 
    strStep = step->Attribute("name"); 
    QLabel *label1 = new QLabel("step"); 
    label1->setText(strStep); 
    label1->setParent(centralWidget()); 
    label1->move(380,y); 
    label1->show(); 
    step = step->NextSiblingElement("Step"); 
    y = y+15; 
} 

Это ui программы до сих пор.

program_ui

Я хочу написать шаг теста, который пользователь щелкает и я не хочу, чтобы мой код, чтобы писать шаги, когда пользователь случайно нажмите на родительский элемент (единица), но до сих пор моя программа пишет первые шаги, когда пользователь нажимает на любой из элементов. Кто-нибудь знает, как искать конкретный тест и его шаг?

ответ

0

Вы можете использовать QDomElement::elementsByTagName (const QString & tagname) для поиска конкретного элемента:

QFile file(fileName); 
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) 
{ 
    qDebug("Failed to open file for reading."); 
    return ; 
} 
QDomDocument document; 
if(!document.setContent(&file)) 
{ 
    qDebug("Failed to parse the file into a DOM tree."); 
    file.close(); 
    return ; 
} 
file.close(); 


QDomElement documentElement = document.documentElement(); 


QDomNodeList testElements = documentElement.elementsByTagName("test"); 

for (int i=0;i<testElements.count();i++) 
{ 

    QDomElement test = testElements.item(i).toElement(); 

    if(test.attribute("no")=="1") 
    { 
     QDomNodeList stepElements = test.elementsByTagName("step"); 

     for (int j=0;j<stepElements.count();j++) 
     { 

       QDomElement step = stepElements.item(j).toElement(); 

       if(step.attribute("no")=="1") 
       { 
        //... 
       } 

     } 
    } 

} 
+0

Спасибо за ответ, что это здорово и выглядит действительно аккуратный, но это в любом случае сделать это с помощью tinyxml? Я не использую QtXml, и проект требует использования tinyxml. – Ashtaroth

+0

Существует функция, которая почти такая же, как у одного Неята, указывающего на: 'TiXmlHandle :: FirstChildElement (const char * value) const' (Возвращает дескриптор первого дочернего элемента с заданным именем.). См. Http://www.grinninglizard.com/tinyxmldocs/index.html для получения дополнительной информации;) – Martin

-2

http://www.cnblogs.com/lyggqm/p/4565749.html

http://blog.csdn.net/lujianxin1098/article/details/

const char * cXmlName = "files.xml"; 
string strPath; 
// createXml(ccXmlName); 
// readXml(cXmlName); 
// insert(ccXmlName); 
// readXml(ccXmlName); 

ShowSingleNode(cXmlName, "Document", "title", 
       "About VMware Player Help"); 

strPath = PathOpt(); 

bool ret = ModifySingleNode(cXmlName, "Document", "title", 
          "About VMware Player Help", strPath); 

if (ret) 
{ 
    cout << "OK" << endl; 
} 
else 
{ 
    cout << "false" << endl; 
} 

ShowSingleNode("hhhhhhhhhhhhh.xml", "Document", 
       "title", "About VMware Player Help"); 
return 0; 
Смежные вопросы