在MATLAB中解析XML字符串

时间:2012-02-28 21:07:39

标签: java xml matlab xml-parsing

我需要用MATLAB解析XML字符串(注意:没有文件I / O,因此我不想将字符串写入文件然后读取它们)。我从HTTP连接接收字符串,解析速度非常快。我最关心的是读取整个字符串中某些标签的值

网络充满了使用regexp解析XML的死亡威胁,所以我不想进入那个。我知道MATLAB有无缝的Java集成,但我不是很精通java。有没有一种快速的方法可以非常快速地从XML获取某些值?

例如,我想从下面的字符串中获取'volume'信息并将其写入变量。

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>


<root>
  <volume>256</volume>
  <length>0</length>
  <time>0</time>
  <state>stop</state>
  ....

3 个答案:

答案 0 :(得分:7)

对于它的价值,下面是执行所需任务的Matlab可执行Java代码,无需写入中间文件:

%An XML formatted string
strXml = [...
    '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>' char(10)...
    '<root>' char(10) ...
    '  <volume>256</volume>' char(10) ...
    '  <length>0</length>' char(10) ...
    '  <time>0</time>' char(10) ...
    '  <state>stop</state>' char(10) ...
    '</root>' ];

%"simple" java code to create a document from said string
xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse(java.io.StringBufferInputStream(strXml));

%"intuitive" methods to explore the xmlDocument
nodeList = xmlDocument.getElementsByTagName('volume');
numberOfNodes = nodeList.getLength();

firstNode = nodeList.item(0);
firstNodeContent = firstNode.getTextContent;

disp(firstNodeContent);  %Returns '256'

作为替代方案,如果您的应用程序允许,请考虑将URL直接传递到XML解析器中。未经测试的java代码如下,但这也可能打开了Matlab内置的xslt函数。

xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse('URL_AS_A_STRING_HERE');

文档here。从“javax.xml.parsers”包开始。

答案 1 :(得分:1)

有一整套class of functions用于处理xml,包括xmlreadxmlwrite。这些应该对你的问题非常有用。

答案 2 :(得分:1)

我根本不熟悉Matlab的API,但我要指出,如果您只想要从XML流中获取特定值,那么使用Pursuit概述的DOM方法将占用大部分时间/内存。 HTTP连接。

虽然STAX将为您提供Java中最快的解析方法,但使用API​​可能很难处理,特别是如果您不熟悉Java。您可以使用SJXP这是一个非常简单的抽象,在Java中进行STAX解析(免责声明:我是作者),允许您定义所需元素的路径,然后为解析器提供一个流(您的HTTP)在这种情况下流)并为您提取所有值。

作为一个例子,假设你想要发布的XML示例中的/ root / state和/ root / volume值,实际的Java看起来像这样:

// Create /root/state rule
IRule stateRule = new DefaultRule(Type.CHARACTER, "/root/state") {
    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
        System.out.println("State is: " + text);
    }
}

// Create /root/volume rule
IRule volRule = new DefaultRule(Type.CHARACTER, "/state/volume") {
    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
        System.out.println("Volume is: " + text);
    }
}

// Create the parser with the given rules
XMLParser parser = new XMLParser(stateRule, volRule);

您可以在程序启动时执行所有初始化,然后在稍后处理来自HTTP连接的流时,您可以执行以下操作:

parser.parser(httpConnection.getOutputStream());

等;然后,当解析器通过HTTP连接中的字符流运行时,将调用您在规则中定义的所有处理程序代码。

正如我所提到的,我不熟悉Matlab,并且不知道“matlab-i-fy”这段代码的正确方法,但从第一个例子看,你可以或多或少直接使用Java API在这种情况下,如果这个解决方案比DOM方法重要,那么这个解决方案将更快并且使用更少的内存进行解析。