[原创]QT 解析 XML文档

    在编写QT程序的时候我们有时需要进行DOM的解析, 简单的DOM可以使用基于事件的解析方法, 层级结构较复杂的程序我们需要进行DOM方式的解析, 也就是基于文档的解析, QT对DOM的文档解析方式支持不是很好, 在使用的时候会遇到一些问题, 在这里我记录一些使用的技巧。


    首先, 我们还是要明确一些XML中的概念。XML中的内容叫做文档, 即document, 文档有一个根结点, 一般是<xml></xml>这个节点。 XML是由节点(node)构成的, 节点有很多种类型, 常见的是元素节点(elementnode), 文本节点(textnode), 属性节点(attributenode)。


    接下来我们来看常用的操作在QT中的实现方法。


在QTCreator中使用QT的DOM XML解析时要在pro文件中添加 QT += xml


一。获取文档对象

    从字符串创建XML文档对象

QDomDocument dom("解析器的名字");
dom.setContent(xml_content, &error_string, &error_line, &error_column); 
    // xml_content 是xml字符串, 后边的参数用来存储返回的错误信息


二。获取文档的根节点

QDomElement root = dom.documentElement();

 

三。根据ID获取元素

    直到4。7。3, QT的这个方法还是空实现, 所以只能自己实现一个, 下面是我写的一个简单实现, 请自行优化

QDomElement SomeClass::getElementById(QDomElement& parent, QString id)
{
    QDomNodeList children = parent.childNodes();
    QDomElement child_element;
    QDomElement empty;
    for (uint step = 0; step != children.length(); ++ step)
    {

        // 如果不是element, 跳过
        if (children.item(step).nodeType() != QDomNode::ElementNode)
        {
            continue;
        }
        child_element = children.item(step).toElement();
        // 找到了要找的element
        if (child_element.attribute("id") == id)
        {
            return child_element;
        }else // 否则递归
        {
            empty = getElementById(child_element, id);
            if (!empty.isNull())
            {
                break;
            }
        }
    }
    return empty;
}

 

四。遍历一个元素的子元素

    注意, 元素指的是元素节点

for (QDomElement step = word_name_e.firstChildElement();
         step != word_name_e.lastChildElement();
         step = step.nextSiblingElement())
{
    // 对step进行操作
}

 

五。将节点转换为元素节点

    这里说的转换是指将代表节点的对象转换为代表元素节点的对象

node.toElement(); // 这个方法很有用, 当你获得了一个节点, 要调取这个节点的某个属性时, 你会发现QDomElement
    才有这样的方法

 

六。将某节点下的所有文档内容保存为字符串

QString target_string;
QTextStream stream;
stream.setString(&target_string);
node.save(stream, 0);

 







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值