在网上找了一些例子,但是都不够细致,甚至错误连连。这篇帖子介绍了如何通过matlab读取xml文件,已经顺在matlab 2009中运行。
这个程序中,最可能遇到的错误是你的xml文件格式不正确,导致无法读取。比如说,如果xml文件第一行首位有个空格,
- _<?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文件:
- 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 文件:
- <?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中,关于节点类型的几个宏的定义。
- 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