Russian Qt Forum
Ноябрь 22, 2024, 22:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение тегов XML  (Прочитано 5790 раз)
Astrologer
Гость
« : Сентябрь 28, 2010, 11:52 »

Всем привет. Есть такой XML файл.
Код:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <html>
   <body>
    <h1>My first report</h1>
    <h2></h2>
    <table border="1">
     <tr bgcolor="#9acd32">
      <th>TYPE</th>
      <th>AZ1</th>
      <th>H</th>
      <th>POLAR</th>
      <th>IMAGE</th>
      <th>POWER</th>
      <th>KONTR</th>
     </tr>
     <xsl:for-each select="Root/Table1/Row0">
      <tr>
       <td>
        <xsl:value-of select="TYPE"/>
       </td>
       <td>
        <xsl:value-of select="AZ1"/>
       </td>
       <td>
        <xsl:value-of select="H"/>
       </td>
       <td>
        <xsl:value-of select="POLAR"/>
       </td>
       <td>
        <xsl:value-of select="IMAGE"/>
       </td>
       <td>
        <xsl:value-of select="POWER"/>
       </td>
       <td>
        <xsl:value-of select="KONTR"/>
       </td>
      </tr>
     </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>
</xsl:stylesheet>

Нужно прочитать тег "h1". Пишу:
Код:
QDomDocument doc;
    QFile file("d:\\dbf\\xsl.xsl");
     if (!file.open(QIODevice::ReadOnly))
         return;
     if (!doc.setContent(&file)) {
         file.close();
         return;
     }
     file.close();

     QDomElement deRoot = doc.documentElement();
     QDomElement deNode = deRoot.namedItem("h1").toElement();
     bool _is_null = deNode.isNull();

_is_null = true; Что я делаю не так?
Записан
Alp
Гость
« Ответ #1 : Сентябрь 28, 2010, 12:25 »

Думаю, дело в том, что, согласно ассистанту:
===========
QDomNode QDomNode::namedItem ( const QString & name ) const
Returns the first direct child node for which nodeName() equals name.
If no such direct child exists, a null node is returned.
===========
А у тебя тег h1 не является прямым потомком рутноды. Т.е. надо переместиться на тэг body и уже для него вызывать namedItem.

С другой стороны, если тебе нужны не все теги, а только пара, то стоит посмотреть в сторону SAX-разборщика, там на каждый тип/элемент происходит вызов коллбэка, где уже проверяешь нужная ли это нода.
« Последнее редактирование: Сентябрь 28, 2010, 12:28 от alp » Записан
Astrologer
Гость
« Ответ #2 : Сентябрь 28, 2010, 12:32 »

пасибо)) Пробую так:
Код:
QDomElement deRoot = doc.documentElement();
QDomElement deNode = deRoot.namedItem("body").toElement();
bool _is_null = deNode.isNull();

И опять true.
Записан
Astrologer
Гость
« Ответ #3 : Сентябрь 28, 2010, 12:35 »

Записываю так:
Код:
void QModelDOMParser::saveXSL()
{
    QFile file;
    QTextStream stream(&file);
    file.setFileName("d:\\dbf\\xsl.xsl");
    file.open(QFile::WriteOnly);

    QDomDocument doc;
    QDomProcessingInstruction xmlDeclaration = doc.createProcessingInstruction(
            "xml", "version=\"1.0\" encoding=\"windows-1251\"");
    doc.appendChild(xmlDeclaration);
    QDomElement xslElement = doc.createElement("xsl:stylesheet");
    xslElement.setAttribute("version", "1.0");
    xslElement.setAttribute("xmlns:xsl", "http://www.w3.org/1999/XSL/Transform");
    doc.appendChild(xslElement);

    QDomElement xslTemplate = doc.createElement("xsl:template");
    xslTemplate.setAttribute("match", "/");
    xslElement.appendChild(xslTemplate);

    QDomElement htmlEl = doc.createElement("html");
    xslTemplate.appendChild(htmlEl);

    QDomElement bodyEl = doc.createElement("body");
    htmlEl.appendChild(bodyEl);

    QDomElement h1El = doc.createElement("h1");
    QDomText h1Text = doc.createTextNode("My first report");
    h1El.appendChild(h1Text);
    bodyEl.appendChild(h1El);
    
    QDomElement h2El = doc.createElement("h2");
    QDomText h2Text = doc.createTextNode(objectName);
    h2El.appendChild(h2Text);
    bodyEl.appendChild(h2El);

    QDomElement tableEl = doc.createElement("table");
    tableEl.setAttribute("border", "1");
    bodyEl.appendChild(tableEl);

    QDomElement trEl = doc.createElement("tr");
    trEl.setAttribute("bgcolor", "#9acd32");
    tableEl.appendChild(trEl);

    for (int i = 0; i < myModel->columnCount(); ++i)
    {
        QDomElement thEl = doc.createElement("th");
        QDomText thText = doc.createTextNode(myModel->headerData(i, Qt::Horizontal).toString());
        thEl.appendChild(thText);
        trEl.appendChild(thEl);
    }
    
    QDomElement xslForEachEl = doc.createElement("xsl:for-each");
    xslForEachEl.setAttribute("select", "Root/Table1/Row0");
    tableEl.appendChild(xslForEachEl);

    QDomElement trEl_u = doc.createElement("tr");
    xslForEachEl.appendChild(trEl_u);

    for (int i = 0; i < myModel->columnCount(); ++i)
    {
        QDomElement td = doc.createElement("td");
        trEl_u.appendChild(td);

        QDomElement xslValueOfEl = doc.createElement("xsl:value-of");
        QDomText xslValueText = doc.createTextNode(myModel->headerData(i, Qt::Horizontal).toString());
        xslValueOfEl.setAttribute("select", myModel->headerData(i, Qt::Horizontal).toString());
        td.appendChild(xslValueOfEl);
    }

    stream << doc.toString();
    file.close();
}
Такой код выводит "xsl:stylesheet":
Код:
 QDomNode n = doc.firstChild();
      while (!n.isNull()) {
          if (n.isElement()) {
              QDomElement e = n.toElement();
              qDebug() << "Element name: " << e.tagName() << endl;
              break;
          }
          n = n.nextSibling();
      }
« Последнее редактирование: Сентябрь 28, 2010, 12:40 от Astrologer » Записан
Alp
Гость
« Ответ #4 : Сентябрь 28, 2010, 12:55 »

Корневой элемент у тебя - "<xsl:template match="/">", значит первым делом перемещаемся на "<html>", затем на "<body>", только затем уже на "<h1>". Попробуй так.
Записан
deaks
Гость
« Ответ #5 : Сентябрь 28, 2010, 14:28 »

В принципе ты можешь сделать так

Код:
QDomNodeList tmpNodeList = doc.elementsByTagName("h1");  /// теперь в tmpNodeList лежит список всех тэгов h1

QDomNode tmpNode = tmpNodeList.at(0);  ///берешь первый по списку тэг h1, либо в цикле пробегаешь по всем

QString tmpStr = tmpNode.toElement().text();  ///вуаля, все лежит на месте

конечно это все можно написать в одну строку, но для наглядности сделал так

Записан
Astrologer
Гость
« Ответ #6 : Сентябрь 28, 2010, 15:16 »

Спасибо, друзья. Сделал так:
Код:
 QDomElement Root = doc.documentElement();
     QDomNodeList deNode = Root.childNodes();
     QDomNode body = deNode.at(0).firstChild().firstChild();//iterate to <body> element
     QString nodeName = body.nodeName();//make sure it is "body" indeed
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.042 секунд. Запросов: 21.