android用XmlSerializer序列和DOM库生成相机标定所需的xml文件

第一种:用XmlSerializer序列生成

XmlSerializer序列化的进行xml文件生成,先生成xml文件file,然后依次创建字段和属性、内容。

代码部分:

 XmlSerializer serializer = Xml.newSerializer();
            //生成xml文件
            File file = new File(CameraCalibrationActivity.camXmlDir, CameraCalibrationActivity.camxmlName);
            String filepath = file.toString();
            FileOutputStream os = new FileOutputStream(file);
            //设置文件属性
            serializer.setOutput(os,null);
//            serializer.setOutput(os, "utf-8");
            //声明文件
            serializer.startDocument(null,null);
//            serializer.startDocument("utf-8", true);
            //依次创建节点,子节点,每个节点开始和结束用startTag和endTag对应
            serializer.startTag(null, "opencv_storage");
            serializer.startTag(null, "width");
            serializer.text("640");
            serializer.endTag(null, "width");
            serializer.startTag(null, "height");
            serializer.text("360");
            serializer.endTag(null, "height");
//            serializer.startTag(null, "front-camera");
//            serializer.text(String.valueOf(CameraCalibrationActivity.useFrontCamera));
//            serializer.endTag(null, "front-camera");
            serializer.startTag(null, "intrinsic");
            //text设置节点的内容;attribute设置节点的属性
            serializer.attribute(null, "type_id", "opencv-matrix");
            serializer.startTag(null, "rows");
            serializer.text("3");
            serializer.endTag(null, "rows");
            serializer.startTag(null, "cols");
            serializer.text("3");
            serializer.endTag(null, "cols");
            serializer.startTag(null, "dt");
            serializer.text("d");
            serializer.endTag(null, "dt");
            serializer.startTag(null, "data");

            serializer.text(mCameraMatrix.dump().replaceAll(",|;|\n|\\[|\\]"," "));
            serializer.text(mCameraMatrix.dump().replaceAll("[^\\d+.\\d*]"," "));

            serializer.endTag(null, "data");
            serializer.endTag(null, "intrinsic");

            serializer.startTag(null, "distortion");
            serializer.attribute(null, "type_id", "opencv-matrix");
            serializer.startTag(null, "rows");
            serializer.text("1");
            serializer.endTag(null, "rows");
            serializer.startTag(null, "cols");
            serializer.text("5");
            serializer.endTag(null, "cols");
            serializer.startTag(null, "dt");
            serializer.text("d");
            serializer.endTag(null, "dt");
            serializer.startTag(null, "data");
            serializer.text(mDistortionCoefficients.dump().replaceAll(",|;|\n|\\[|\\]"," "));
            serializer.endTag(null, "data");
            serializer.endTag(null, "distortion");
            serializer.endTag(null, "opencv_storage");
            serializer.endDocument();
            os.close();

 

生成的xml文件内容:

<?xml version='1.0' ?>
<opencv_storage>
    <width>640</width>
    <height>360</height>
    <intrinsic type_id="opencv-matrix">
        <rows>3</rows>
        <cols>3</cols>
        <dt>d</dt>
        <data> 1525.174224257012  0  281.0668250311186   0  1416.554890602685  174.0337634173058   0  0  1 </data>
    </intrinsic>
    <distortion type_id="opencv-matrix">
        <rows>1</rows>
        <cols>5</cols>
        <dt>d</dt>
        <data> 1.592037923355059   -35.45112132219147   -0.005026373674759685   -0.02963218744653484   0.2060552434851344 </data>
    </distortion>
</opencv_storage>

第二种:DOM库

DOM库是一种tree结构生成xml的方法使用DOM方式生成XML文件有如下几步:

首先是创建DOM树(即规定XML文件中的内容):

  • 创建DocumentBuilderFactory对象
  • 通过DocumentBuilderFactory对象创建DocumentBuilder对象
  • 通过DocumentBuilder对象的newDocument()方法创建一个Document对象,该对象代表一个XML文件
  • 通过Document对象的createElement()方法创建根节点
  • 通过Document对象的createElement()方法创建N个子节点,并为他们赋值,再将这些子节点添加到根节点下
  • 将根节点添加到Document对象下

其次是将DOM树转换为XML文件:

  • 创建TransformerFactory类的对象
  • 通过TransformerFactory创建Transformer对象
  • 使用Transformer对象的transform()方法将DOM树转换为XML文件。(该方法有两个参数,第一个参数为源数据,需要创建DOMSource对象并将Document加载到其中;第二个参数为目的文件,即要生成的XML文件,需要创建StreamResult对象并指定目的文件)

 

参考文章:https://blog.csdn.net/u012325167/article/details/50943202

代码及注释:

Import部分是根据对应函数标红时import即可

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

    

// 创建DocumentBuilderFactory类的对象

DocumentBuilderFactory d=DocumentBuilderFactory.newInstance();

//创建DocumentBuilder 对象
    DocumentBuilder db= d.newDocumentBuilder();

//使用DocumentBuildernewDocument函数创建Document对象
    Document document=db.newDocument();
    //创建根节点opencv_storage
    Element bookstore=document.createElement("opencv_storage");
    //创建子节点共4个widthheightintrinsicdistortion
    Element width=document.createElement("width");

//setTextContent设置节点里的内容
    width.setTextContent("640");
    Element height=document.createElement("height");
    height.setTextContent("360");
    Element intrinsic=document.createElement("intrinsic");

//通过Element的setAttribute()方法设置属性
    intrinsic.setAttribute("type_id","opencv-matrix");
    Element rows=document.createElement("rows");
    rows.setTextContent("3");

//appendChild()为节点添加子节点。
    intrinsic.appendChild(rows)
    Element cols=document.createElement("cols");
    cols.setTextContent("3");
    intrinsic.appendChild(cols);

    Element dt=document.createElement("dt");
    dt.setTextContent("d");
    intrinsic.appendChild(dt);

    Element data=document.createElement("data");
    data.setTextContent(mCameraMatrix.dump().replaceAll("[^\\d+.\\d*]"," "));
    intrinsic.appendChild(data);

    Element distortion=document.createElement("distortion");
    distortion.setAttribute("type_id","opencv-matrix");

    Element rows_distor=document.createElement("rows");
    rows_distor.setTextContent("1");
    distortion.appendChild(rows_distor);

    Element cols_distor=document.createElement("cols");
    cols_distor.setTextContent("5");
    distortion.appendChild(cols_distor);

    Element dt_distor=document.createElement("dt");
    dt_distor.setTextContent("d");
    distortion.appendChild(dt_distor);

    Element data_distor=document.createElement("data");
    data_distor.setTextContent(mDistortionCoefficients.dump().replaceAll(",|;|\n|\\[|\\]"," "));
    distortion.appendChild(data_distor);



    // Add the first level child node to the bookstore root node

//为根节点添加开始定义的四个子节点width,height,intrinsic,distortion
    bookstore.appendChild(width);
    bookstore.appendChild(height);
    bookstore.appendChild(intrinsic);
    bookstore.appendChild(distortion);
    // 将根节点添加到Document下
    document.appendChild(bookstore);

 

开始生成XML文件:


    // 创建TransformerFactory对象
    TransformerFactory tff=TransformerFactory.newInstance();
    // 创建Transformer对象
    Transformer tf=tff.newTransformer();
    // 设置可以换行
    tf.setOutputProperty(OutputKeys.INDENT, "yes");
    //使用Transformer对象的transform()方法将DOM树转换成XML    tf.transform(new DOMSource(document), new StreamResult(new File(
            CameraCalibrationActivity.camXmlDir, CameraCalibrationActivity.camxmlName)));
} catch (TransformerException ex) {
    ex.printStackTrace();
}

生成的xml文件内容:

<?xml version="1.0" encoding="UTF-8"?><opencv_storage>
<width>640</width>
<height>360</height>
<intrinsic type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data> 539.9093951882751  0  321.3058690096929   0  543.82630380056  188.422723329043   0  0  1 </data>
</intrinsic>
<distortion type_id="opencv-matrix">
<rows>1</rows>
<cols>5</cols>
<dt>d</dt>
<data> 0.1267966909091117   -0.1562953517019846   0.00306116355770148   0.0008756658222796317   -0.381491938819962 </data>
</distortion>
</opencv_storage>

两种生成方式不同点在于<?xml version="1.0" encoding="UTF-8"?>中,version="1.0"xmlSerializer生成的是单引号,DOM生成的是双引号,我的任务中必须双引号才可以读取xml内容。

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值