索尼wifi控制相机开发总结(二):xml流文件的处理

        在获取到相机设备配置文件(.xml)后, 调用qt的QNetworkAccessManager的get方法, 获得了用QByteArray的二进制xml文件, 对文件进行处理, 要使用到QXmlStreamReader.

     QXmlStreamReader的使用

        QXmlStreamReader可以使用QByteArray和IO实例化, 假设实例化以后的对象名为reader, 有如下代码操作:

int CameraDscXmlResolve::resolve()
{
    QXmlStreamReader reader(_xml);
    while (!reader.atEnd()) {
        if(reader.isStartElement())
        {
            if(reader.name() == "friendlyName"){
                _cameraName = reader.readElementText();
            }
            else if(reader.name() == "X_ScalarWebAPI_ServiceType")
            {
                QString serviceType = reader.readElementText();
                if(serviceType == "camera")
                    _isCamera = true;
                else
                    _isCamera = false;
            }else if(reader.name() == "X_ScalarWebAPI_ActionList_URL"){
                if(_isCamera){
                    _cameraAPIUrl.append(reader.readElementText());
                    _isCamera = false;
                    return 0;
                }
            }
            reader.readNext();
        }
        else
        {
            reader.readNext();
        }
    }
    if (reader.hasError()) {
        return 2;
    }
    return 1;
}
}
       这里使用的惯用形式是只需要顺序读一次, 不需要反复读的xml文件(读了第一个属性, 读第二个, 依次下去, 不会回头去读第一个), 常用的形式就是如下提取出来的代码:
        while (!reader.atEnd()) {
            //read element
            .......
            reader.readNext(); //指向下一个分隔符
        }
        if (reader.hasError()) {
                //handle error
                .......
        }

      中间的读取流程的话, 首先要判断是否为元素的开头,  reader.isStartElement(), 如果是元素开头的话, 读取元素的名字reader.name(), 找到感兴趣的元素, 读取元素的内容reader.readElementText().

        根据索尼相机开发文档, 索尼相机的控制接口放在名为"X_ScalarWebAPI_ActionList_URL"的元素中, 至此, 就获得了索尼相机的API的URL, 可以对索尼相机进行操控了.

        有一点要额外说明的就是, 索尼相机厉害的地方在于, 把相机控制命令都封装成了http的post请求方法来调用, 而不是传统usb控制相机和部分wifi控制相机(亲测的有fuji)那样, 用ptp协议来进行控制, 让开发者摆脱了复杂的ptp封装和解析(相同厂家, 使用ptp控制相机的指令, 也会因为相机机型的不同而有所变化, 比如索尼的EOS系列和PowerShot就是不一样的指令封装, 虽然都遵循ptp协议, 但是找它的具体指令真的很麻烦, 用bushound去抓包, 然后对比着ptp的协议标准去比对才知道指令是什么意思, 这个在之后总结ptp相机的博客会具体说).


        

猜你喜欢

转载自blog.csdn.net/weixin_41793452/article/details/80340539