MATLAB社区

MATLAB,社区和更多

XML和MATLAB:导航树

本周,我将发布关于使用XML的系列文章的第三部分。因为我收到了讨论这个话题的请求,所以我把它提前了。下周我们将回到新的MATLAB R2010b特性。

最后一次在我的XML in MATLAB系列中,我解释了创建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

假设我想找到Friendly的电话号码。为了做到这一点,我要启动根节点AddressBook从那里,我将沿着树走到AddressBook/Entry/PhoneNumber,获取PhoneNumber节点。

%获取“AddressBook”节点addressBookNode = docNode.getDocumentElement;%获取所有的“Entry”节点条目= addressBookNode.getChildNodes;%获取第一个“Entry”的子元素%记住java数组是基于零的friendlyInfo = entries.item .getChildNodes (0);%遍历节点以找到“PhoneNumber”一旦没有更多的兄弟姐妹,“node”将为空节点= friendlyInfo.getFirstChild;~ isempty(节点)如果strcmpi (node.getNodeName“PhoneNumber”打破其他的节点= node.getNextSibling;结束结束phoneNumber = node.getTextContent
phoneNumber = (508) 647-7000

getChildNodes ()方法返回节点列表。有几种方法可以导航返回的节点列表。在上面的例子中getFirstChild ()哪个返回第一个子元素(在本例中是的名字节点)。然后利用getNextSibling ()方法,我可以遍历所有其他子节点来找到我要找的那个,在本例中是PhoneNumber.我使用了getNodeName ()方法获取节点的字符串值,以便将其与“PhoneNumber”进行比较。如果你在看一个节点的方法getNodeName ()方法是多余的getTagName ()方法。

一旦我有了想要的节点,我就用getTextContent ()方法获取< PhoneNumber > < / PhoneNumber >标签。注意,如果有多个PhoneNumber的子节点条目,这将停止后,找到第一个。

另一种遍历子节点的方法是使用项目()方法请注意,因为这是一个Java数组,所以数组索引从0变为size-1。

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

而不是迭代来找到PhoneNumber节点,我们可以使用ElementsByTagName方法查找子树中具有特定名称的所有元素。这将返回一个匹配节点列表,我们可以对其进行迭代,但因为我知道只有一个节点PhoneNumber我只取了第0个元素

phoneNumber = friendlyInfo.getElementsByTagName (“PhoneNumber”.getTextContent) .item (0)
phoneNumber = (508) 647-7000

使用XPath
XPath是一种用于在XML文档中查找节点的语言,随Java而来。它的工作原理类似于Java的正则表达式引擎,创建一个表示希望匹配的节点的字符串,将其编译为内部表示,然后在文档中对其进行计算。这是一个高级的步骤,我想不出在普通的MATLAB中有什么是这样的。XPath表达式可以从树的顶部开始,也可以从文档或文档片段中的任何位置开始。节点路径像目录路径一样表示,因为“..”“上升一级”。,节点之间用斜杠“/”隔开。在我们的例子中,第一个条目的第一个电话号码是/ PhoneNumber AddressBook /条目. " " // "表示文档中的任何位置,因此" //PhoneNumber "也将匹配相同的节点。

要使用XPath,首先需要从XPath工厂创建一个XPath对象。在下面的例子中,我首先导入了xpath包,以便更容易键入所有这些不同的Java类。一旦有了XPath对象,就可以编译和计算表达式了。

%将xpath机制添加到工作区中进口javax.xml.xpath。*工厂= XPathFactory.newInstance;xpath = factory.newXPath;编译并计算XPath表达式表达= xpath.compile (“AddressBook /条目/ PhoneNumber”);phoneNumberNode =表达式。评估(docNode XPathConstants.NODE);phoneNumber = phoneNumberNode.getTextContent
phoneNumber = (508) 647-7000

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

phoneNumber=expression.evaluate(docNode,XPathConstants.STRING)
phoneNumber = (508) 647-7000

XPath是一个复杂的主题,可能值得我们在后续文章中讨论。该语言足够丰富,可以从树中的任意位置开始,精确地从XML文档中挑出任何节点、实体、属性或其他数据片段。

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

参考

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。