赞
踩
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 添加整个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就是自定义的属性。
首先要获取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好处是把格式统一了,把读写文件的问题抽象化了,但是也把读写的问题折腾得够呛了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。