matlab读取xml文件
2016-03-27 19:00
926 查看
在网上找了一些例子,但是都不够细致,甚至错误连连。这篇帖子介绍了如何通过matlab读取xml文件,已经顺在matlab 2009中运行。
这个程序中,最可能遇到的错误是你的xml文件格式不正确,导致无法读取。比如说,如果xml文件第一行首位有个空格,
[html] view
plain copy
_<?xml version="1.0" ?>
会出现如下错误:
The processing instruction target matching "[xX][mM][lL]" is not allowed.
所以xml 文件弄好后,最好用IE浏览器打开,检查xml格式是否正确。
这个例子中有两种节点,一种是没有子节点的,如<ID>;另外一种是有子节点的,如<FDs type_id="opencv-matrix">。具体语法参考注释。
以下是matlab文件:
[python] view
plain copy
clear;
xmlDoc = xmlread('test.xml'); % 读取文件 test.xml
%% Extract ID
IDArray = xmlDoc.getElementsByTagName('ID'); % 将所有ID节点放入数组IDArray
for i = 0 : IDArray.getLength-1 % 此例子中, IDArray.getLength 等于 2
nodeContent = char(IDArray.item(i).getFirstChild.getData) % 提取当前节点的内容
end
%% extract the FDs
FDsArray = xmlDoc.getElementsByTagName('FDs'); % 将所有FDs节点放入数组FDsArray
for i = 0 : FDsArray.getLength-1
thisItem = FDsArray.item(i); %
FDsAttributes = char(thisItem.getAttributes.item(0).getValue) % 提取FDs节点的属性,如果没有属性或不需要提取,可以注释掉。这里,FDsAttributes = opencv-matrix
childNode = thisItem.getFirstChild ;
while ~isempty(childNode) % 遍历FDs的所有子节点,也就是遍历 ("rows, cols, data") 节点
if childNode.getNodeType == childNode.ELEMENT_NODE ; % 检查当前节点没有子节点, childNode.ELEMENT_NODE 定义为没有子节点。
childNodeNm = char(childNode.getTagName) % 当前节点的名字
childNodeData = char(childNode.getFirstChild.getData) % 当前节点的内容
end % End IF
childNode = childNode.getNextSibling; % 切换到下一个节点
end % End WHILE
end
test.xml 文件:
[html] view
plain copy
<?xml version="1.0" ?>
<opencv_storage>
<model1>
<ID>1</ID>
<FDs type_id="opencv-matrix">
<rows>100</rows>
<cols>10</cols>
<data>0.16975 0.14135 0.048581 </data>
</FDs>
</model1>
<model2>
<ID>2</ID>
<FDs type_id="opencv-matrix">
<rows>100</rows>
<cols>10</cols>
<data>0.095217 0.17111 0.11691 </data>
</FDs>
</model2>
</opencv_storage>
最后附上matlab中,关于节点类型的几个宏的定义。
[plain] view
plain copy
1 ELEMENT_NODE
2 ATTRIBUTE_NODE
3 TEXT_NODE
4 CDATA_SECTION_NODE
5 ENTITY_REFERENCE_NODE
6 ENTITY_NODE
7 PROCESSING_INSTRUCTION_NODE
8 COMMENT_NODE
9 DOCUMENT_NODE
10 DOCUMENT_TYPE_NODE
11 DOCUMENT_FRAGMENT_NODE
12 NOTATION_NODE
这个程序中,最可能遇到的错误是你的xml文件格式不正确,导致无法读取。比如说,如果xml文件第一行首位有个空格,
[html] view
plain copy
_<?xml version="1.0" ?>
会出现如下错误:
The processing instruction target matching "[xX][mM][lL]" is not allowed.
所以xml 文件弄好后,最好用IE浏览器打开,检查xml格式是否正确。
这个例子中有两种节点,一种是没有子节点的,如<ID>;另外一种是有子节点的,如<FDs type_id="opencv-matrix">。具体语法参考注释。
以下是matlab文件:
[python] view
plain copy
clear;
xmlDoc = xmlread('test.xml'); % 读取文件 test.xml
%% Extract ID
IDArray = xmlDoc.getElementsByTagName('ID'); % 将所有ID节点放入数组IDArray
for i = 0 : IDArray.getLength-1 % 此例子中, IDArray.getLength 等于 2
nodeContent = char(IDArray.item(i).getFirstChild.getData) % 提取当前节点的内容
end
%% extract the FDs
FDsArray = xmlDoc.getElementsByTagName('FDs'); % 将所有FDs节点放入数组FDsArray
for i = 0 : FDsArray.getLength-1
thisItem = FDsArray.item(i); %
FDsAttributes = char(thisItem.getAttributes.item(0).getValue) % 提取FDs节点的属性,如果没有属性或不需要提取,可以注释掉。这里,FDsAttributes = opencv-matrix
childNode = thisItem.getFirstChild ;
while ~isempty(childNode) % 遍历FDs的所有子节点,也就是遍历 ("rows, cols, data") 节点
if childNode.getNodeType == childNode.ELEMENT_NODE ; % 检查当前节点没有子节点, childNode.ELEMENT_NODE 定义为没有子节点。
childNodeNm = char(childNode.getTagName) % 当前节点的名字
childNodeData = char(childNode.getFirstChild.getData) % 当前节点的内容
end % End IF
childNode = childNode.getNextSibling; % 切换到下一个节点
end % End WHILE
end
test.xml 文件:
[html] view
plain copy
<?xml version="1.0" ?>
<opencv_storage>
<model1>
<ID>1</ID>
<FDs type_id="opencv-matrix">
<rows>100</rows>
<cols>10</cols>
<data>0.16975 0.14135 0.048581 </data>
</FDs>
</model1>
<model2>
<ID>2</ID>
<FDs type_id="opencv-matrix">
<rows>100</rows>
<cols>10</cols>
<data>0.095217 0.17111 0.11691 </data>
</FDs>
</model2>
</opencv_storage>
最后附上matlab中,关于节点类型的几个宏的定义。
[plain] view
plain copy
1 ELEMENT_NODE
2 ATTRIBUTE_NODE
3 TEXT_NODE
4 CDATA_SECTION_NODE
5 ENTITY_REFERENCE_NODE
6 ENTITY_NODE
7 PROCESSING_INSTRUCTION_NODE
8 COMMENT_NODE
9 DOCUMENT_NODE
10 DOCUMENT_TYPE_NODE
11 DOCUMENT_FRAGMENT_NODE
12 NOTATION_NODE
相关文章推荐
- 应用中Matlab语句学习笔记总结1
- matlab两种不同模式的并行运算
- 在matlab上安装svm
- 在matlab上安装svm
- DL:Convolutional Deep Belief Networks(CDBN) 代码(matlab)理解
- MATLAB绘制空间域高斯函数
- matlab 调用 opengl 画骨架
- MATLAB以MEX方式调用C代码
- MATLAB内的傅里叶变换
- Python and Matlab绘制曲线图
- 装载: Matlab 提取矩阵 某一行 或者 某一列 的方法
- MATLAB中字符串数组的创建和引用
- fluent ubuntu gnom matlab parallel
- MATLAB编译c++出错的解决办法(Error in compile (line 439) mex(args{:});)
- 图像质心分析:Matlab、质心法,高斯拟合法
- 关于循环读入多幅图片的方法(matlab和OpenCV)
- MATLAB/c++混合编程
- #怎样在Matlab中画柠檬
- Matlab---在多个axes之间切换
- 用Matlab画直方图