在网上找了一些例子,但是都不够细致,甚至错误连连。这篇帖子介绍了如何通过matlab读取xml文件,已经顺在matlab 2009中运行。
这个程序中,最可能遇到的错误是你的xml文件格式不正确,导致无法读取。比如说,如果xml文件第一行首位有个空格,
_<?xml version="1.0" ?>会出现如下错误:
The processing instruction target matching "[xX][mM][lL]" is not allowed.
所以xml 文件弄好后,最好用IE浏览器打开,检查xml格式是否正确。
这个例子中有两种节点,一种是没有子节点的,如;另外一种是有子节点的,如。具体语法参考注释。
以下是matlab文件:
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 文件:
1
100
10
0.16975 0.14135 0.048581
2
100
10
0.095217 0.17111 0.11691
最后附上matlab中,关于节点类型的几个宏的定义。
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