精华内容
下载资源
问答
  • XML和YAML的使用方法

    2020-10-26 18:27:39
    什么是YAML呢?它相比XML又有哪些优缺点呢?什么情况下用YAML呢?YAML怎么使用呢?在此做一个简单的总结。
  • JSON,CSV,XML和YAML的世界国家/地区。 国家数据 此存储库包含JSON,CSV,XML和YAML所定义的世界国家/地区列表(按照 。 警告:并非该项目中的所有实体都是独立国家; 请参阅independent财产,以了解该国是否被视为...
  • XML和YAML的区别与使用方法

    千次阅读 2018-05-30 10:07:11
    最近处理一些配置文件,碰到了YAML格式的文件,因为之前没接触过此格式的文件,对于XML还比较熟悉一些。那么什么是YAML呢?它相比XML又有哪些优缺点呢?什么情况下用YAML呢?YAML怎么使用呢?在此做一个简单的总结吧...

    最近处理一些配置文件,碰到了YAML格式的文件,因为之前没接触过此格式的文件,对于XML还比较熟悉一些。那么什么是YAML呢?它相比XML又有哪些优缺点呢?什么情况下用YAML呢?YAML怎么使用呢?在此做一个简单的总结吧。咱们就先从XML来说吧。

    相信XML大家都比较熟知吧。下面是我从网络上摘取的概念性的东西,大家可以看一下。在此就不多说了。更多的说一些基本用法。

    XML

    概述:

    可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

    格式特性:

    XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是存储数据。事实上XML与其他数据表现形式最大的不同是:它极其简单,这是一个看上去有点琐细的优点,但正是这点使XML与众不同。

    XML与HTML的设计区别是:XML被设计为传输和存储数据,其焦点是数据的内容。而HTML被设计用来显示数据,其焦点是数据的外观。HTML旨在显示信息,而 XML旨在传输信息。

    XML和HTML语法区别:HTML的标记不是所有的都需要成对出现,XML则要求所有的标记必须成对出现;HTML标记不区分大小写,XML则大小敏感,即区分大小写。

    读写:

    XML读写我所熟悉的有两种方式,一种是通过JavaScript来获取XML值,一个是用PHP来读取。XML的编写大家可以参考着手册,XML格式比较自由,可以自定义标签,但有一个原则就是要直观。下面直接列举出示例供大家测试,如有问题大家可以交流。

    note.xml

    1 <?xml version="1.0" encoding="ISO-8859-1"?>
    2 <note>
    3   <from>John</from>
    4   <to>George</to>
    5   <message>Don't forget the meeting!</message>
    6 </note>

    xml_test.html

    复制代码
     1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     2 <html xmls="http://www.w3.org/1999/xhtml">
     3 <body>
     4   <p>
     5     <b>To:</b> <span id="to"></span><br />
     6     <b>From:</b> <span id="from"></span><br />
     7     <b>Message:</b> <span id="message"></span>
     8   </p>
     9 <script type="text/javascript">
    10 if (window.XMLHttpRequest)
    11   {// code for IE7+, Firefox, Chrome, Opera, Safari
    12   xmlhttp=new XMLHttpRequest();
    13   }
    14 else
    15   {// code for IE6, IE5
    16   xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    17   }
    18   xmlhttp.open("GET","note.xml",false);
    19   xmlhttp.send();
    20   xmlDoc=xmlhttp.responseXML;
    21 
    22   document.getElementById("to").innerHTML=
    23   xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
    24   document.getElementById("from").innerHTML=
    25   xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
    26   document.getElementById("message").innerHTML=
    27   xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;
    28 </script>
    29 
    30 </body>
    31 </html>
    复制代码

    xml_test.php

    复制代码
    <?php 
    //创建DOM对象
    $xml = new DOMDocument(); 
    //读取XML文件
    $xml = simplexml_load_file('note.xml'); 
    //输出XML文件中from属性,多个相同属性也就是数组的形式,可以用下标来取值
    echo $xml->from;
    ?>
    复制代码

    YAML

    简介:

    YAML 作为一种比 XML 更为简单易读的序列化语言,正越来越多地被用于应用及配置文件的开发中。本文将简单介绍 YAML 的现状,YAML 与 XML 相比的优劣势,并通过实际的例子给出 YAML 的典型应用场景及其使用方法(涵盖 c/c++、ruby、PHP等)。

    优势:

    YAML的可读性好。

    YAML和脚本语言的交互性好。

    YAML使用实现语言的数据类型。

    YAML有一个一致的信息模型。

    YAML易于实现。

    上面5条也就是XML不足的地方。同时,YAML也有XML的下列优点:

    YAML可以基于流来处理;

    YAML表达能力强,扩展性好。

    总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。

    更多的内容及规范参见http://www.yaml.org。

    语法:

    Structure通过空格来展示。Sequence里的项用"-"来代表,Map里的键值对用":"分隔.

    这几乎就是所有的语法了.

    比如……

    一般YAML文件扩展名为.yaml。比如:john.yaml

    复制代码
     1 name: John Smith
     2 
     3 age: 37
     4 
     5 spouse:
     6 
     7 name: Jane Smith
     8 
     9 age: 25
    10 
    11 children:
    12 
    13 - name: Jimmy Smith
    14 
    15 age: 15
    16 
    17 - name: Jenny Smith
    18 
    19 age 12
    复制代码

     

    John今年37岁,有一个幸福的四口之家。两个孩子Jimmy 和Jenny活泼可爱。妻子Jane年轻美貌。

    如果深入研究的话还可能发现一些社会问题^_^。

    可见YAML的可读性是不错。

    读写:

    PHP对于YAML的读写,我推荐使用Spyc类读写YAML文件。

    Spyc类文件下载地址:

    https://github.com/mustangostang/spyc/

     

    Spyc只有2个类方法可供使用,一个是读取YAML文件,一个是生成YAML文件格式。下面从这个两种方法介绍下。

    复制代码
    1 include('spyc.php');
    2 
    3 // 读取YAML文件,生成数组
    4 $yaml = Spyc::YAMLLoad('spyc.yaml');
    5 
    6 // 将数组转换成YAML文件
    7 $array['name']  = 'andy';
    8 $array['site'] = '21andy.com';
    9 $yaml = Spyc::YAMLDump($array);
    复制代码

     

    php.ini读取ini的解析方式那种配置没法支持多维数组,So,我对yaml生成多维数组很感兴趣,主要想做一下配置文件,如下:

      - { row: 0, col: 0, func: {tx: [0, 1]} }

    转为php多维数组如下:

    test.yaml(这个例子是我的DB配置文件,强烈推荐使用!

    复制代码
    1 DB:
    2   default:
    3     dsn: 'mysql:dbname=test;host=127.0.0.1'
    4     user: 'root'
    5     pass: '111'
    6   session:
    7     dsn: 'mysql:dbname=test;host=127.0.0.1'
    8     user: 'root'
    9     pass: '111'
    复制代码

    test.php

    复制代码
    1 <?php
    2 include('spyc.php');
    3 //读取YAML文件,生成数组
    4 $yaml = Spyc::YAMLLoad('test.yaml');
    5 echo "<pre>";
    6 print_r($yaml);
    7 echo "</pre>";
    复制代码

    PHP code

    复制代码
     1 Array
     2 (
     3     [DB] => Array
     4         (
     5             [default] => Array
     6                 (
     7                     [dsn] => mysql:dbname=test;host=127.0.0.1
     8                     [user] => root
     9                     [pass] => 111
    10                 )
    11 
    12             [session] => Array
    13                 (
    14                     [dsn] => mysql:dbname=test;host=127.0.0.1
    15                     [user] => root
    16                     [pass] => 111
    17                 )
    18 
    19         )
    20 
    21 )
    复制代码

     

    PHP生成YAML文件示例:

    复制代码
     1 <?php
     2 include('spyc.php');
     3 //将数组转换成YAML文件格式
     4 $array['name']  = 'PHP程序猿的笔记';
     5 $array['site'] = 'www.songchaoke.cn';
     6 $yaml = Spyc::YAMLDump($array);
     7 //将转换的YAML写入到文件中
     8 $f = fopen('test2.yaml',"w+");
     9 fwrite($f,$yaml);
    10 fclose($f);
    复制代码

     

     

    概念性文字参考资料:http://baike.baidu.com/view/159832.htm?fromId=63

    展开全文
  • 易于使用的工具来配置JSON,XML和YAML的转换。 每个人都记得在构建过程中使用语法来转换配置文件。 但是世界在变化,现在您可以在.NET项目中使用不同的配置类型。 魔术块可让您转换JSON,XML和YAML文件。 您可以在...
  • 示例程序:XML和YAML文件的写入 //----------------输入输出XML和YAML文件------------------------------------ //描述:XML:可扩展标识语言----开发者根据自身需要可定义自己的标记。后缀:.yml // TAML:是一个...

    示例程序:XML和YAML文件的写入

    //----------------输入输出XML和YAML文件------------------------------------
    //描述:XML:可扩展标识语言----开发者根据自身需要可定义自己的标记。后缀:.yml
    //      TAML:是一个可读性高,用来表达资料序列的格式。后缀:.yaml
    //   储存类为:FileStorage
    //----------------------------------------------------------------------
    
    //----------------【XML和YAML文件的写入】---------------------
    
    //       "<<"文件写入操作;“>>”文件读取操作
    //vector(arrays)结构的输入输出在第一个元素前加“[”,最后一个元素上加“[”
    //map结构的操作使用符号“{”和“}”
    #include <opencv2/opencv.hpp>
    #include <time.h>
    
    using namespace cv;
    
    #define _CRT_SECURE_NO_WARNINGS
    
    int main() {
    	//初始化
    	FileStorage fs("test.yaml",FileStorage::WRITE);//文件打开
    
    	//开始文件写入“<<”
    	fs << "frameCount" << 5;
    	time_t rawtime;
    	time(&rawtime);
    	fs << "calibrationDate" << asctime(localtime(&rawtime));
    	//数据结构的初始化
    	Mat cameraMatrix = (Mat_<double>(3,3)<<1000,0,320,0,1000,240,0,0,1);
    	Mat distCoeffs = (Mat_<double>(5,1)<<0.1,0.01,-0.001,0,0);
    	//向Mat中写入数据
    	fs << "cameraMatrix" <<cameraMatrix<<"distCoffs"<<distCoeffs ;
    	fs << "features" << "[";//开始读入features文本序列
    	for (int i = 0; i < 3;i++) {
    		int x = rand() % 640;
    		int y = rand() % 480;
    		uchar lbp = rand() % 256;
    
    		fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";
    		for (int j = 0; j < 8; j++)
    			fs << ((lbp >> j ) & 1);
    		fs << "]" << "}";
    	}
    	fs << "]";//关闭序列
    	fs.release();//文件关闭
    
    	printf("文件读写完毕,请在工程目录下查看生成的文件~!");
    	getchar();
    
    	return 0;
    }
    

    运行结果:

     

     

     

    XML和YAML文件的读取:

    //-----------------【XML和YAML文件的读取】---------------------------
    #include <opencv2/opencv.hpp>
    #include <time.h>
    
    using namespace cv;
    using namespace std;
    
    int main() {
    	//改变console字体颜色
    	system("color 6F");
    	//初始化
    	FileStorage fs2("test.yaml",FileStorage::READ);//要读取的文件
    
    	//第一种方法,对FileNode操作
    	int frameCount = (int)fs2["frameCount"];
    
    	std::string date;
    
    	//第二种方法,使用FileNode运算符>>
    	fs2["calibrationDate"] >> date;
    
    	Mat cameraMatrix2, distCoeffs2;
    	fs2["cameraMatrix"] >> cameraMatrix2;
    	fs2["distCoeffs"] >> distCoeffs2;
    
    	cout << "frameCount:" << frameCount << endl
    		<< "calibratioin date:"<<date << endl
    		<< "camera matrix:" << cameraMatrix2 << endl
    		<< "distortion coeffs:" << distCoeffs2 << endl;
    
    	FileNode features = fs2["features"];
    	FileNodeIterator it = features.begin(), it_end = features.end();
    	int idx = 0;
    	std::vector<uchar> lbpval;
    
    	//使用FileNodeIterator遍历序列
    	for (; it != it_end;++it,idx++) {
    		cout << "feature #" << idx << ":";
    		cout << "x=" << (int)(*it)["x"] << ",y=" << (int)(*it)["y"] << ", lbp: (";
    
    		//我们也可以使用filenode>>std::veator操作符来很容易的读数值阵列
    		(*it)["lbp"] >> lbpval;
    		for (int i = 0; i < (int)lbpval.size(); i++)
    			cout << " " << (int)lbpval[i];
    		cout << ")" << endl;
    	}
    	fs2.release();
    	//程序结束,输出一些帮助文字
    	printf("\n文件读取完毕,请输入任意键结束程序~!");
    	getchar();
    
    	return 0;
    
    }

    运行结果:

     注:

    1、在编程的过程中出现问题:显示asctime定义或功能不安全,需要对项目属性进行配置,添加_CRT_SECURE_NO_WARNINGS点确认后就配置好了。然后运行程序就正常了。

    2、如果运行程序的时候没有报任何错误,但是程序运行框一闪而退。此时一定是程序运行过程某句代码出错,但是我们又无法找到错误的点。打开项目属性----->链接器------>系统---->子系统。选择控制台确定后,运行程序如果代码运行出错会弹出相应的错误问题。如:读取图片出错(项目下没有此图片)。

    3、其它闪退情况试试:Ctrl+f5或main函数的return语句前加:system("pause");或百度其它方法。

    展开全文
  • 输入输出XML和YAML文件

    2019-05-24 15:43:18
    什么是XML和YAML 示例程序:XML和YAML文件的写入 示例程序:XML和YAML文件的读取 什么是XML和YAML   XML(eXtensible Markup Language)是一种元标记语言。所谓“原标记”,就是开发者可以根据自身需要定义的标记,...

    什么是XML和YAML
    示例程序:XML和YAML文件的写入
    示例程序:XML和YAML文件的读取

    什么是XML和YAML

      XML(eXtensible Markup Language)是一种元标记语言。所谓“原标记”,就是开发者可以根据自身需要定义的标记,任何满足XML命名规则的名称都可以标记。此外,XML是一种语义/结构化语言,它描述了文档的结构和语义。
      YAML(YAML Ain’t a Markup Language)也是一种置标语言,但它是以数据为中心,而不是以置标语言为重点,用来表达资料序列的格式。

    示例程序:XML和YAML文件的写入

      让我们先看一个关于XML或者YAML文件的写入实例,如下

    #include <opencv2/opencv.hpp>
    #include <time.h>
    
    using namespace cv;
    
    int main()
    {
    	//初始化
    	FileStorage fs("test.yaml", FileStorage::WRITE);
    
    	//开始文件写入
    	fs << "frameCount" << 5;
    	time_t rawtime; time(&rawtime);
    	fs << "calibrationDate" << asctime(localtime(&rawtime));
    
    	Mat cameraMatrix = (Mat_<double>(5, 1) << 1000, 0, 320, 0, 1000);
    	Mat distCoeffs = (Mat_<double>(5, 1) << 0.1, 0.01, -0.001, 0, 0);
    	fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs;
    
    	fs << "features" << "[";
    	for (int i = 0; i < 3; i++)
    	{
    		int x = rand() % 640;
    		int y = rand() % 480;
    		uchar lbp = rand() % 256;
    		fs << "{:" << "x" << x << "y" << y << "lbp" << "[:";
    		for (int j = 0; j < 8; j++)
    		{
    			fs << ( (lbp >> j) & 1);
    		}
    		fs << "]" << "}";
    
    	}
    	fs << "]";
    	fs.release();
    
    	printf("文件读写完毕,请在工程目录下查看生成的文件~");
    	getchar();
    	return 0;
    }
    

      效果图
    在这里插入图片描述
      运行此程序,会在工程目录下程序一个名为“test.yaml”的文件
    在这里插入图片描述
      用sublime打开
    在这里插入图片描述
      如果我们修改上面的代码的FileStorage fs(“test.yaml”,FileStorage::WRITE)这一句代码,将其中的“test.yaml”的后缀换为xml、yml、txt甚至doc,都可以得到运行结果的,大家不妨尝试一下。

    示例程序:XML和YAML文件的读取

      读操作的完整源代码如下:

    //--------------------------XML和YAML文件的读取---------------------------------
    #include <opencv2/opencv.hpp>
    #include <time.h>
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
    	//改变console字体颜色
    	system("color 6F");
    
    	//初始化
    	FileStorage fs2("test.yaml", FileStorage::READ);
    
    	//第一种方法,对FileNode操作
    	int frameCount = (int)fs2["frameCount"];
    
    	std::string date;
    	//第二种方法,使用FileNode运算符 >>
    	fs2["calibrationDate"] >> date;
    
    	Mat cameraMatrix2, distCoeffs2;
    	fs2["cameraMatrix"] >> cameraMatrix2;
    	fs2["distCoeffs"] >> distCoeffs2;
    
    	cout << "frameCount:" << frameCount << endl
    		<< "calibration date:" << date << endl
    		<< "camera matrix:" << cameraMatrix2 << endl
    		<< "distortion coeffs:" << distCoeffs2 << endl;
    
    	FileNode features = fs2["features"];
    	FileNodeIterator it = features.begin(), it_end = features.end();
    	int idx = 0;
    	std::vector<uchar> lbpval;
    
    	//使用FileNodeIterator遍历序列
    	for (; it!= it_end; ++it, idx++)
    	{
    		cout << "feature #" << idx << ":";
    		cout << "x=" << (int)(*it)["x"] << ",y=" << (int)(*it)["y"] << ",lbp:(";
    		(*it)["lbp"] >> lbpval;
    		for (int i = 0; i < (int)lbpval.size(); i++)
    			cout << " " << (int)lbpval[i];
    		cout << ')' << endl;
    	}
    	fs2.release();
    
    	//程序结束,输出一些帮助文字
    	printf("\n 文件读取完毕,请输入任意键结束程序~");
    	getchar();
    
    	return 0;
    }
    

      效果图:
    在这里插入图片描述
      此程序需要工程目录下指定文件存在,如我们之前刚刚生成的test.yaml复制到工程目录下,运行此程序,便可以得到正确的结果。

    展开全文
  • 参考: ...2、https://github.com/opencv/opencv/File Input and Output using XML and YAML ...如何使用YAMLXML文件打印读取文本OpenCV文件? 如何为OpenCV数据结构做同样的事情? 如何为你的数据结构做到这一点?

    参考:
    1、https://docs.opencv.org/3.2.0/
    2、https://github.com/opencv/opencv/


    File Input and Output using XML and YAML files

    你会找到以下问题的答案:

    • 如何使用YAML或XML文件打印和读取文本和OpenCV文件?
    • 如何为OpenCV数据结构做同样的事情?
    • 如何为你的数据结构做到这一点?
    • 使用OpenCV数据结构,如cv :: FileStorage,cv :: FileNode或cv ::
      FileNodeIterator。

    源代码

    您可以从这里下载,或者在OpenCV源代码库的samples / cpp / tutorial_code / core / file_input_output / file_input_output.cpp中找到它。

    以下是如何实现目标列表中枚举的所有东西的示例代码。

    #include <opencv2/core.hpp>
    #include <iostream>
    #include <string>
    using namespace cv;
    using namespace std;
    static void help(char** av)
    {
        cout << endl
            << av[0] << " shows the usage of the OpenCV serialization functionality."         << endl
            << "usage: "                                                                      << endl
            <<  av[0] << " outputfile.yml.gz"                                                 << endl
            << "The output file may be either XML (xml) or YAML (yml/yaml). You can even compress it by "
            << "specifying this in its extension like xml.gz yaml.gz etc... "                  << endl
            << "With FileStorage you can serialize objects in OpenCV by using the << and >> operators" << endl
            << "For example: - create a class and have it serialized"                         << endl
            << "             - use it to read and write matrices."                            << endl;
    }
    class MyData
    {
    public:
        MyData() : A(0), X(0), id()
        {}
        explicit MyData(int) : A(97), X(CV_PI), id("mydata1234") // explicit to avoid implicit conversion
        {}
        void write(FileStorage& fs) const                        //Write serialization for this class
        {
            fs << "{" << "A" << A << "X" << X << "id" << id << "}";
        }
        void read(const FileNode& node)                          //Read serialization for this class
        {
            A = (int)node["A"];
            X = (double)node["X"];
            id = (string)node["id"];
        }
    public:   // Data Members
        int A;
        double X;
        string id;
    };
    //These write and read functions must be defined for the serialization in FileStorage to work
    static void write(FileStorage& fs, const std::string&, const MyData& x)
    {
        x.write(fs);
    }
    static void read(const FileNode& node, MyData& x, const MyData& default_value = MyData()){
        if(node.empty())
            x = default_value;
        else
            x.read(node);
    }
    // This function will print our custom class to the console
    static ostream& operator<<(ostream& out, const MyData& m)
    {
        out << "{ id = " << m.id << ", ";
        out << "X = " << m.X << ", ";
        out << "A = " << m.A << "}";
        return out;
    }
    int main(int ac, char** av)
    {
        if (ac != 2)
        {
            help(av);
            return 1;
        }
        string filename = av[1];
        { //write
            Mat R = Mat_<uchar>::eye(3, 3),
                T = Mat_<double>::zeros(3, 1);
            MyData m(1);
            FileStorage fs(filename, FileStorage::WRITE);
            fs << "iterationNr" << 100;
            fs << "strings" << "[";                              // text - string sequence
            fs << "image1.jpg" << "Awesomeness" << "../data/baboon.jpg";
            fs << "]";                                           // close sequence
            fs << "Mapping";                              // text - mapping
            fs << "{" << "One" << 1;
            fs <<        "Two" << 2 << "}";
            fs << "R" << R;                                      // cv::Mat
            fs << "T" << T;
            fs << "MyData" << m;                                // your own data structures
            fs.release();                                       // explicit close
            cout << "Write Done." << endl;
        }
        {//read
            cout << endl << "Reading: " << endl;
            FileStorage fs;
            fs.open(filename, FileStorage::READ);
            int itNr;
            //fs["iterationNr"] >> itNr;
            itNr = (int) fs["iterationNr"];
            cout << itNr;
            if (!fs.isOpened())
            {
                cerr << "Failed to open " << filename << endl;
                help(av);
                return 1;
            }
            FileNode n = fs["strings"];                         // Read string sequence - Get node
            if (n.type() != FileNode::SEQ)
            {
                cerr << "strings is not a sequence! FAIL" << endl;
                return 1;
            }
            FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
            for (; it != it_end; ++it)
                cout << (string)*it << endl;
            n = fs["Mapping"];                                // Read mappings from a sequence
            cout << "Two  " << (int)(n["Two"]) << "; ";
            cout << "One  " << (int)(n["One"]) << endl << endl;
            MyData m;
            Mat R, T;
            fs["R"] >> R;                                      // Read cv::Mat
            fs["T"] >> T;
            fs["MyData"] >> m;                                 // Read your own structure_
            cout << endl
                << "R = " << R << endl;
            cout << "T = " << T << endl << endl;
            cout << "MyData = " << endl << m << endl << endl;
            //Show default behavior for non existing nodes
            cout << "Attempt to read NonExisting (should initialize the data structure with its default).";
            fs["NonExisting"] >> m;
            cout << endl << "NonExisting = " << endl << m << endl;
        }
        cout << endl
            << "Tip: Open up " << filename << " with a text editor to see the serialized data." << endl;
        return 0;
    }

    说明

    这里我们只讨论关于XML和YAML文件的输入。 您的输出(及其各自的输入)文件可能只有这些扩展名之一和来自此的结构。 它们是可以序列化的两种数据结构:映射(如STL映射)和元素序列(如STL向量)。 它们之间的区别在于,在地图中,每个元素都有一个唯一的名字,通过你可以访问它的东西。 对于序列,您需要通过它们来查询特定项目。

    1、XML / YAML文件打开和关闭。 在你写这些文件的任何内容之前,你需要打开它,最后关闭它。 OpenCV中的XML / YAML数据结构是cv :: FileStorage。 要指定文件绑定到硬盘上的这个结构,你可以使用它的构造函数或open()函数:

    string filename = "I.xml";
    FileStorage fs(filename, FileStorage::WRITE);
    //...
    fs.open(filename, FileStorage::READ);

    你使用第二个参数中的任何一个是一个常数,指定你可以在其上执行的操作的类型:WRITE,READ或APPEND。 文件名中指定的扩展名也决定了将要使用的输出格式。 如果指定* .xml.gz *之类的扩展名,输出可能会被压缩。

    该文件在cv :: FileStorage对象被销毁时自动关闭。 但是,您可以通过释放函数明确地调用它:

    fs.release();                                       // explicit close

    2、输入和输出文本和数字。 数据结构使用与STL库相同的<<输出运算符。 为了输出任何类型的数据结构,我们首先需要指定它的名字。 我们只需打印出这个名字就可以了。 对于基本类型,您可以按照以下值打印:

    fs << "iterationNr" << 100;

    读入是一个简单的寻址(通过[]运算符)和铸造操作或通过>>操作符读取:

    int itNr;
    fs["iterationNr"] >> itNr;
    itNr = (int) fs["iterationNr"];

    3、OpenCV数据结构的输入/输出。 那么这些行为就像基本的C ++类型一样:

    Mat R = Mat_<uchar >::eye  (3, 3),
        T = Mat_<double>::zeros(3, 1);
    fs << "R" << R;                                      // Write cv::Mat
    fs << "T" << T;
    fs["R"] >> R;                                      // Read cv::Mat
    fs["T"] >> T;

    4、向量(数组)和关联映射的输入/输出。 正如我之前提到的,我们也可以输出地图和序列(数组,矢量)。 再次,我们首先打印变量的名称,然后我们必须指定我们的输出是序列还是映射。

    对于第一个元素之前的序列,打印“[”字符,在最后一个之后打印“]”字符:

    fs << "strings" << "[";                              // text - string sequence
    fs << "image1.jpg" << "Awesomeness" << "baboon.jpg";
    fs << "]";                                           // close sequence

    对于地图演练是相同的,但现在我们使用“{”和“}”分隔符:

    fs << "Mapping";                              // text - mapping
    fs << "{" << "One" << 1;
    fs <<        "Two" << 2 << "}";

    为了读取这些,我们使用cv :: FileNode和cv :: FileNodeIterator数据结构。 cv :: FileStorage类的[]运算符返回一个cv :: FileNode数据类型。 如果节点是顺序的,我们可以使用cv :: FileNodeIterator迭代项目:

    FileNode n = fs["strings"];                         // Read string sequence - Get node
    if (n.type() != FileNode::SEQ)
    {
        cerr << "strings is not a sequence! FAIL" << endl;
        return 1;
    }
    FileNodeIterator it = n.begin(), it_end = n.end(); // Go through the node
    for (; it != it_end; ++it)
        cout << (string)*it << endl;

    对于maps,您可以再次使用[]运算符来访问给定的项目(或者>>运算符):

    n = fs["Mapping"];                                // Read mappings from a sequence
    cout << "Two  " << (int)(n["Two"]) << "; ";
    cout << "One  " << (int)(n["One"]) << endl << endl;

    6、读写你自己的数据结构。 假设你有一个数据结构如:

    class MyData
    {
    public:
          MyData() : A(0), X(0), id() {}
    public:   // Data Members
       int A;
       double X;
       string id;
    };

    可以通过在OpenCV I / O XML / YAML接口(如OpenCV数据结构的情况下)通过在类的内部和外部添加读取和写入功能来对其进行序列化。 对于内部部分:

    void write(FileStorage& fs) const                        //Write serialization for this class
    {
      fs << "{" << "A" << A << "X" << X << "id" << id << "}";
    }
    void read(const FileNode& node)                          //Read serialization for this class
    {
      A = (int)node["A"];
      X = (double)node["X"];
      id = (string)node["id"];
    }

    那么你需要在类之外添加下面的函数定义:

    void write(FileStorage& fs, const std::string&, const MyData& x)
    {
    x.write(fs);
    }
    void read(const FileNode& node, MyData& x, const MyData& default_value = MyData())
    {
    if(node.empty())
        x = default_value;
    else
        x.read(node);
    }

    在这里你可以观察到,在read 部分,我们定义了如果用户试图读取一个不存在的节点会发生什么。 在这种情况下,我们只是返回默认的初始化值,但是更详细的解决方案是为对象ID返回一个负值。

    一旦添加了这四个函数,使用>>操作符进行写操作,使用<<操作符进行读操作:

    MyData m(1);
    fs << "MyData" << m;                                // your own data structures
    fs["MyData"] >> m;                                 // Read your own structure_

    或者尝试阅读non-existing read:

    fs["NonExisting"] >> m;   // Do not add a fs << "NonExisting" << m command for this to work
    cout << endl << "NonExisting = " << endl << m << endl;
    展开全文
  • opencv中xml和yaml读写

    2020-01-10 23:22:40
    1.YAML和XML的读操作 //yaml的写入 FileStorage fs("test.yaml", FileStorage::WRITE); fs << "frameCount" << 5; Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240...
  • 基于它们,它提供了一个能够处理CSV , JSON , YAML和XML文件的Import Source 。 它还提供了通过Icinga Director部署手工制作的配置文件的Icinga Director 。 要开始使用,请阅读我们的,然后您应该准备好研究...
  • 可能大部分人到现在接触的XML和YAML文件很少,等以后训练人脸模型进行人脸识别的时候用的就多了。现在先了解一下这两种文件类型。 XML:Extensible Markup Language,可扩展标记语言,标准通用语言的子集,是一种...
  • 以下是《OpenCV3编程入门》中5.6.3的示例程序的C# + EMGU 3.4.1版,C++程序相比,有如下几点不同: 1. 使用Matrix&lt;&gt;存储多维数组,多维数组的各维需要使用{}扩起来,之间用逗号分隔; 2. C#中无法...
  • XML和YAML文件的简介2. 文件操作步骤step1 文件的打开读操作的准备写操作的准备step2 文件的读写操作Mat结构数字的读写写入数据读取数据vector(arrays)maps的读写step3 文件的关闭3.例程 1. XML和YAML文件的...
  • OpenCV读写XML和YAML格式文件 1.什么是XMLYAML XML:最早的通用信息标记语言,可扩展性好,但繁琐 YAML:非标记语言,相比XML利用空各缩进分行,显示了数据的结构性,简化了书写格式,降低了复杂度,提升易读性 2....
  • 6 OpenCV xml和yaml读写

    2021-02-09 23:32:52
    * @brief XML和yaml读写 */ #include "opencv2/opencv.hpp" #include <iostream> #include <string> int main(int argc, char *argv[]) { if (argc != 3) { std::cout << "参数错误: xml/...
  • 1、XML和YAML文件简介 XML文件是一种元标记语言,即开发者可以根据自身需要定义自己的标记。它是一种语义结构语言,描述了文档的语义结构。 YAML以数据为中心,是一个可读性高,用来表达资料序列的格式。.yml...
  • 目录日志配置:xmlyaml链接池thymeleaf 日志配置: xml logback-spring.xml <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <include resource="org/springframework/boot...
  • OpenCV XML和YAML文件的文件输入输出XML和YAML文件的文件输入输出目标源代码解释XML / YAML文件打开关闭。文本数字的输入输出。OpenCV数据结构的输入/输出。向量(数组)关联图的输入/输出。读写您自己...
  • 文章目录XMLYAML文件读取说明Code XMLYAML文件读取 参考OpenCV3编程入门 1、说明; 2、Code; 3、效果; 说明 1、XML:可扩展标识语言,开发者可以根据自己的需要定义定义自己的标记,是一种语义/结构化语言; 2...
  • XML和YAML文件 XML(eXtensible Markup Lauguage)是一种元标记语言,所谓的“元标记”就是开发者可以根据自身需要定义自己的标记。XML时一种语义/结构化语言,它描述了文档的结构语义 YAML(Ain’t a Markup ...
  • 1. XML和YAML文件简介 本节我们将一起认识XML和YAML这两种文件类型。 所谓XML,即eXtensibleMarkupLanguage,翻译成中文为“可扩展标识语言”。首先,XML是一种元标记语言。所谓“元标记”,就是开发者可以根据自身...
  • XML和YAML文件的写入 #include&lt;opencv2/opencv.hpp&gt; #include &lt;vector&gt; #include &lt;time.h&gt; using namespace std; using namespace cv; int main() { //初始化 ...
  • YAML / JSON / XML操作 可互换地转换YAML / JSON / XML文件格式。 输入项 名称 需要 描述 可能的值 路径 是 待转换文件的路径 <路径> 从 是 文件格式 json , xmlyaml 至 是 结果是文件格式 json , xml ...
  •  FileStorage是OpenCV中XML和YAML文件的存储类,封装了所有有关信息  构造函数为FileStorage::FileStorage ,有两个重载 FileStorage::FileStorage() FileStorage::FileStorage(const string& source ,...
  • opencv2-XML和YAML文件的写入
  • XML和YAML文件的读取

    千次阅读 2016-11-23 18:45:30
    //--------------------------------------【程序说明...// 程序描述:XML和YAML文件的读取 // 开发测试所用操作系统: Windows 7 64bit // 开发测试所用IDE版本:Visual Studio 2010 // 开发测试所用OpenCV版本:
  • 1.XML和YAML文件简介 XML(eXtensible Markup Lauguage)是一种元标记语言,所谓的“元标记”就是开发者可以根据自身需要定义自己的标记。XML是一种语义/结构化语言,它描述了文档的结构语义 YAML(Ain’t a ...
  • 文章目录YAML什么是YAMLYAML有以下基本规则:自定义参数参数引用随机数外部参入优先级多环境配置使用YAML完成多环境配置...但是应对复杂的商业需求下,多环境编程化的配置无法得以满足 为此Spring Cloud为我们提供.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,759
精华内容 15,903
关键字:

xml和yaml