標籤:

XML和MATLAB交互的基本操作[1]:讀取XML

最近工作中遇到了這樣的需求:

  • 數據存儲於XML文件中
  • 需要將XML文件中的部分數據進行讀取後處理
  • 將處理好的數據寫入新的XML文件

XML文件格式大致如下

<?xml version="1.0" encoding="utf-8"?>n<!-- input.xml -->n<root key="value">n <node1>n <data key="true">1</data>n <data key="false">2</data>n <data key="true">3</data>n </node1>n <node2>n <data key="true"/>n </node2>n</root>n

我們的任務是將node1中key的值取出,簡單交換後放到另一個XML文件中,格式如下

<?xml version="1.0" encoding="utf-8"?>n<newroot>n <!-- This is a comment -->n <newdata key="1">true</newdata>n</newroot>n

在MATLAB中,與XML的介面有xmlread和xmlwrite,其底層是用javax.xml.parsers包實現的。

首先我們從input.xml取值

>> dom = xmlread(input.xml)ndom =nn[#document: null]n>> class(dom)nnans =nn org.apache.xerces.dom.DeferredDocumentImpln

如果XML的格式有效,則返回[#document: null]。 可以看到返回的其實是一個java類的實例,熟悉DOM結構的同學會發現,接下來就是基本的DOM操作了。

對於我們這些對DOM一無所知的小白來說,以下是w3schools對DOM的圖解

簡單來說,每一個Element都有一個Tag,Element可以有Attribute,也可以有Text

valuen |n /n<data key="true">1</data>n / / /n | | |n Tag Attribute Textn

通過查看input.xml我們會發現有很多Element都用『data』來做Tag,如果我們直接以『data』作為查詢條件,則會返回很多無用信息。這裡最好的方法是先將搜索範圍縮小到『node1』的子節點。這裡注意需要用item來提取getElementsByTagName到返回值,而且是久違了的從0開始有沒有(其實是java……)

>>nodes = dom.getElementsByTagName(node1);n>>node = nodes.item(0);n

這時我們已經將搜索範圍縮小到node1中了,我們可以使用data作為搜索條件提取

<node1>n <data key="true">1</data>n <data key="false">2</data>n </node1>n

我們可以用getLength來查看返回結果的數量

>>data = node.getElementsByTagName(data)n>>data.getLengthnnans =nn 2n

我們繼續提取attribute,注意下標從0開始。還有一個需要注意的就是Java返回的字元類型都需要轉化為MATLAB的char或string類型

values = string.empty();ntexts = string.empty();nnfor i = 0:data.getLength - 1n element = data.item(i);n % Get Valuen value = element.getAttribute(key)n values = [values,string(value)];n % Get Textn text = element.getTextContent();n texts = [texts,string(text)];nendn

運行後

>> valuesnnvalues = nn 1×3 string arraynn "true" "false" "true"nn>> textsnntexts = nn 1×3 string arraynn "1" "2" "3"n

至此讀取xml格式文件的工作就結束了,下一篇我們繼續將讀取後的數據寫入xml格式文件

推薦閱讀:

如何用matlab繪製三維的頻譜圖(時間-頻率-能量)?
matlab如何很好的處理比較大的數據?
Matlab如何動態呈現計算結果
如何對四旋翼飛行器進行精確的數學建模?
matlab計算速度?

TAG:MATLAB |