Russian Qt Forum

Qt => XML => Тема начата: Astrologer от Сентябрь 28, 2010, 11:52



Название: Чтение тегов XML
Отправлено: 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; Что я делаю не так?


Название: Re: Чтение тегов XML
Отправлено: Alp от Сентябрь 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-разборщика, там на каждый тип/элемент происходит вызов коллбэка, где уже проверяешь нужная ли это нода.


Название: Re: Чтение тегов XML
Отправлено: Astrologer от Сентябрь 28, 2010, 12:32
пасибо)) Пробую так:
Код:
QDomElement deRoot = doc.documentElement();
QDomElement deNode = deRoot.namedItem("body").toElement();
bool _is_null = deNode.isNull();

И опять true.


Название: Re: Чтение тегов XML
Отправлено: Astrologer от Сентябрь 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();
      }


Название: Re: Чтение тегов XML
Отправлено: Alp от Сентябрь 28, 2010, 12:55
Корневой элемент у тебя - "<xsl:template match="/">", значит первым делом перемещаемся на "<html>", затем на "<body>", только затем уже на "<h1>". Попробуй так.


Название: Re: Чтение тегов XML
Отправлено: deaks от Сентябрь 28, 2010, 14:28
В принципе ты можешь сделать так

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

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

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

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



Название: Re: Чтение тегов XML
Отправлено: Astrologer от Сентябрь 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