第一种:用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();
//使用DocumentBuilder的newDocument函数创建Document对象
Document document=db.newDocument();
//创建根节点opencv_storage
Element bookstore=document.createElement("opencv_storage");
//创建子节点共4个width,height,intrinsic,distortion
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内容。