Matlab中处理XML文件

来源:互联网 发布:网络机顶盒app软件排行 编辑:程序博客网 时间:2024/04/29 14:32

三个函数搞定一切

XML格式的问题现在很流行,它往往用作数据存储文件,或者是参数配置文件,我们需要做的有两件事情,从XML文件读取数据,以及把数据储存到XML文件中去。

Matlab使用JAVA虚拟机来处理XML文件,默认给出了三个用于处理XML的函数:

l         xmlread(), 用于读取XML文件内容,读入后的变量是一个Java XML object。

l         xmlwrite(), 用于写入XML文件内容,同样输出变量也要是一个Java XML Object。

l         xslt(),用于stylesheet转换的问题,所以就没有关系。

前面两个函数用的比较多,调用格式很简单。

xDoc=xmlread(文件名) %读取xml文件

xmlwrite(文件名, xDoc)              %写如XML文件,如果取消文件名,那么就直接显示xml文件内容。

 

读取和写入,一个例子

Matlab自带了一个叫做 info.xml 的文件,就用下面这两个函数做个简单的测试。

xmlfile = fullfile(matlabroot, 'toolbox/matlab/general/info.xml');

xDoc=xmlread(xmlfile);

得到的xDoc就是xml变量,格式是Java XML Object。

用下面的代码可以将其直接显示在屏幕上:

xmlwrite(xDoc);

如果要保存到某个xml文件中,则可以用如下的代码:

xmlwrite(‘test.xml’,xDoc);

 

操作内部数据有讲究

针对XML内部数据的操作比较复杂,可以归类为添加、修改、删除三种操作。

  1. 添加操作

1.1    添加整个XML文档。

docNode=com.mathworks.xml.XMLUtils.createDocument('AddressBook');

由此添加了一个AddressBook的文档,之后向文档中再添加其他的节点。添加的方法是先建立这个节点,然后再append到原来

entry_node = docNode.createElement('TestEntry')

docNode.getDocumentElement.appendChild(entry_node)

xmlwrite(docNode);

在作者原文的例子里面,还有:

name_node = docNode.createElement('Name');

name_text = docNode.createTextNode('Friendly J. Mathworker');

name_node.appendChild(name_text);

entry_node.appendChild(name_node);

 

phone_number_node = docNode.createElement('PhoneNumber');

phone_number_text = docNode.createTextNode('(508) 647-7000');

phone_number_node.appendChild(phone_number_text);

entry_node.appendChild(phone_number_node);

 

xmlwrite(docNode)

一行行运行这些例子,然后可以看到结果。下面总结一下

CreateDocument, 用于建立一个Document Object,例如此处用 docNode;

docNode.createElement, 用来建立一个放在命名为docNode中的Element,它可以是Element(Node)也可以是textContent。

特定Node.appendChild(定义好的Element), 向特定的Node中添加Element或者别的类型,例如建立TextNode,当然还有其他很多类型,具体见相关的定义(http://docs.oracle.com/javase/6/docs/api/org/w3c/dom/package-summary.html)

 

1.2 XML的树状格式大概如下:

Document

       第1层Node

              第2层Node

                     TextContent

 

总结一下创建规律:

Document创建用:doc=com.mathworks.xml.XMLUtils.createDocument('名称')

Node创建前都要定义: doc.createElement(‘名称’);

第一层node附加到Doc后面要用doc.getDocumentElement.appendChild()

从第二层开始,可以用node.appendChild()

 

1.3 添加属性:

当然,除了可以给Node添加textContent外,还可以设置属性,例如:

Node名称.setAttribute(‘属性名称’,属性值);

在我的Matlab2011B里面,使用这个语句竟然显示出错,实际上结果没有问题。但是这个确实是error,用lasterr函数可以查询到,因此不能放在自定义的函数里面,不然会中止退出。只能用下面的方法。

 

除了直接设置,也可以先建立属性,然后再修改这个属性的数值。例如下面这个代码:

Attr=docNode.createAttribute(‘AttrName’);

Attr.setNodeValue(‘AttrValue’);

Node1.setAttributeNode(Attr);

结果如何呢?我自己写的代码得到的结果是:

>> xmlwrite(docNode)

 

ans =

 

<?xml version="1.0" encoding="utf-8"?>

<myXML>

   <myNode1 myattr="测试属性">

      <Name>My Name is a</Name>

   </myNode1>

</myXML>

 

其中myattr就是自定义的属性。

 

  1. 查询信息

首先要获取document,

DocE=docNode.getDocumentElement;

接着获取其中的Node

Nodes=DocE.getChildNodes;

然后从其中获取数据

Node.item(0).getNodeName

如果是要获得,这么挺麻烦的,还不如用XPath,更简洁明了:

先在Matlab中输入这段代码:

import javax.xml.xpath.*

factory = XPathFactory.newInstance;

xpath = factory.newXPath;

然后就可以用类似网络地址一样的代码指定Node,例如

url1=xpath.compile('myXML/myNode1/Name');  %指定了一个叫做Name的Node。

getnode = url1.evaluate(docNode, XPathConstants.NODE);       %获取node

然后怎么获取数据呢?

>> getnode.getTextContent

 

ans =

 

My Name is a

 

>> getnode.getNodeName

 

ans =

 

Name

 

另外如果获取一个node里面属性,可以类似地操作:

>> url2=xpath.compile('myXML/myNode1');

>> getnode2=url2.evaluate(docNode,XPathConstants.NODE);

>> getnode2.getAttributes.item(0).getChildNodes

 

ans =

 

myattr="测试属性"

>> getnode2.getAttributes.item(0).getNodeName

 

ans =

 

myattr

 

>> getnode2.getAttributes.item(0).getValue

 

ans =

 

测试属性

 

总之,XML好处是把格式统一了,把读写文件的问题抽象化了,但是也把读写的问题折腾得够呛了。

1 0