Matlab社区

Matlab,社区和更多

XML和MATLAB:导航树

本周我正在使用XML在我的系列中发布第三部分。由于我有一个涵盖这个主题的请求,我已经在计划中搬了它。我们将在下周返回新的Matlab R2010B功能。

最后一次在MATLAB系列中的XML中,我解释了创建XML DOM结构并构建XML树所需的步骤。本周我回答了这个问题:“现在我有一棵树,我如何从中提取数据?”我会继续使用AddressBook例子来自上一篇文章。记住,你可以创建一个新的树或读入MATLAB使用xmlwrite函数。

以下是本系列的其他部分,供您参考:

至少有两种方法可以在Matlab中导航树。我在这里描述的两种方式再次利用与MATLAB运行的Java环境。第一种方法利用树的结构和节点的关系,第二种使用XPath语言精确地挑出一个节点。这一次,这里是示例树:

<?xml version = " 1.0 " encoding = " utf - 8 " ?>  Friendly J. Mathworker (508) 647-7000 
3 Apple Hill Dr, Natick MA

假设我想找到友好的电话号码。为此,我将开始根节点,“AddressBook从那里,我将沿着树走到AddressBook/Entry/PhoneNumber,获取电话号码节点。

%获取“AddressBook”节点addressBookNode = docNode.getDocumentElement;%获取所有的“Entry”节点条目= addressbooknode.getChildNodes;%得到第一个“入场”的孩子%记住java数组是基于零的friendlyinfo = stries.item(0).getChildNodes;%迭代节点以找到“Phonenumber”一旦没有更多的兄弟姐妹,“node”将为空node = friendlinfo.getfirstchild;〜isempty(节点)如果strcmpi(node.getnodename,“PhoneNumber”打破其他的node = node.getnextsibling;结束结束phoneNumber = node.getTextContent
Phonenumber =(508)647-7000

getchildnodes()方法返回节点列表。有几种方法可以导航返回的节点列表。在上面的例子中我使用了getFirstChild ()哪个返回第一个子元素(在本例中是姓名节点)。然后利用getnextsibling()方法,我可以走过所有其他儿童节点来找到我正在寻找的那个,在这种情况下它是电话号码.我使用了getNodeName ()方法获取节点的字符串值,以便将其与“PhoneNumber”进行比较。如果你在看一个节点的方法getNodeName ()方法是多余的getTagName ()方法。

一旦我有所需的节点,我使用了getTextContent ()获取文本内部的方法< PhoneNumber > < / PhoneNumber >标签。请注意,如果有多个电话号码儿童节点条目,这将停止后,找到第一个。

另一种遍历子节点的方法是使用物品()方法。注意,因为这是一个Java数组,所以数组的索引大小从0到1。

我= 0:friendlyInfo。getLength - 1如果strcmpi (friendlyInfo.item .getTagName(我),“PhoneNumber”) phoneNumber = friendlyInfo.item(i).getTextContent . txt . txt结束结束
Phonenumber =(508)647-7000

而不是迭代来找到电话号码节点,我们可以使用ElementsByTagName方法以找到具有某个名称的子树中的所有元素。然后返回我们可以迭代的匹配节点列表,但是因为我知道只有一个电话号码我刚刚抓住了0'th元素:

phoneNumber = friendlyInfo.getElementsByTagName (“PhoneNumber”).Item(0).gettextContent
Phonenumber =(508)647-7000

使用XPath
XPath是一种用于在XML文档中查找节点的语言,并附带Java。它与Java的正则表达式引擎类似地工作,从中创建一个字符串,表示要匹配的节点,编译到内部表示,然后在文档上进行评估。这是一个高级步骤,我无法想到任何在普通的matlab中的任何东西都以同样的方式工作。XPath表达式可以从树的顶部或文档或文档片段中的任何位置启动。节点路径表示像目录路径,因为“..”上升一个级别“。”是相同的级别,节点由正斜杠“/”分开。在我们的示例中,第一个条目的第一电话号码是“/ PhoneNumber AddressBook /条目.” “//” represents anywhere in the document, so “//PhoneNumber” would also match the same nodes.

要使用XPath,首先需要从XPath工厂创建XPath对象。在下面的例子中,我第一次导入了XPath.包让它更容易输入所有这些各种Java类。有一个XPath对象后,您可以编译和评估表达式。

%将XPath机制置于Workspace中进口javax.xml.xpath。*工厂= XPathFactory.newInstance;xpath = factory.newXPath;%编译并评估XPath表达式表达= xpath.compile ('地址簿/条目/ phonenumber');phoneNumberNode =表达式。评估(docNode XPathConstants.NODE);phoneNumber = phoneNumberNode.getTextContent
Phonenumber =(508)647-7000

在上面的例子中evaluate ()方法接受已编译的XPath表达式和XPathConstant.这种常量告诉表达式返回的结果是什么类型的结果。在这种情况下,我们已经要求了节点,这样我们就得到了匹配的节点对象。但是如果我们把常数细绳,我们将直接返回匹配节点的文本,如下一个示例。你也可以问节点集年代,数字年代,布尔基年代。

phoneNumber =表达式。评估(docNode XPathConstants.STRING)
Phonenumber =(508)647-7000

XPath是一个复杂的主题,可能值得在后续文章中讨论。这种语言非常丰富,可以精确地从XML文档中从树的任何位置开始挑出任何节点、实体、属性或数据的其他部分。

对我来说,这是一篇比大多数文章都内容丰富的文章,所以请继续提问或留下评论。

参考

|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击在这里登录您的MathWorks帐户或创建新的。