我需要用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>
....
答案 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,包括xmlread
和xmlwrite
。这些应该对你的问题非常有用。
答案 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方法重要,那么这个解决方案将更快并且使用更少的内存进行解析。