在網上找了一些例子,但是都不夠細緻,甚至錯誤連連。這篇文章介紹了如何通過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