cap*_*gon 8 matlab xml-parsing
我正在使用matlab的xmlread内部函数读取一个简单的xml文件.
<root>
<ref>
<requestor>John Doe</requestor>
<project>X</project>
</ref>
</root>
Run Code Online (Sandbox Code Playgroud)
但是当我调用ref元素的getChildren()时,它告诉我它有5个孩子.
如果我将所有XML放在一行中,它工作正常.Matlab告诉我,ref元素有2个孩子.
它似乎不喜欢元素之间的空格.
即使我在oXygen XML编辑器中运行Canonicalize,我仍然会得到相同的结果.因为Canonicalize仍然留有空间.
Matlab使用java和xerces作为xml的东西.
我能做些什么才能让我的xml文件保持人类可读的格式(不是全部都在一行),但仍然可以正确解析matlab吗?
filename='example01.xml';
docNode = xmlread(filename);
rootNode = docNode.getDocumentElement;
entries = rootNode.getChildNodes;
nEnt = entries.getLength
Run Code Online (Sandbox Code Playgroud)
cho*_*and 10
幕后的XML解析器为节点元素之间的所有空白创建#text节点.无论是换行还是缩进,它都会创建一个带有换行符的#text节点,并在节点的数据部分中跟随缩进空格.因此,在解析"ref"元素的子节点时提供的xml示例中,它返回5个节点
此函数为您删除所有这些无用的#text节点.请注意,如果你故意让一个xml元素只由空白组成,那么这个函数将删除它,但对于99.99%的xml情况,这应该可以正常工作.
function removeIndentNodes( childNodes )
numNodes = childNodes.getLength;
remList = [];
for i = numNodes:-1:1
theChild = childNodes.item(i-1);
if (theChild.hasChildNodes)
removeIndentNodes(theChild.getChildNodes);
else
if ( theChild.getNodeType == theChild.TEXT_NODE && ...
~isempty(char(theChild.getData())) && ...
all(isspace(char(theChild.getData()))))
remList(end+1) = i-1; % java indexing
end
end
end
for i = 1:length(remList)
childNodes.removeChild(childNodes.item(remList(i)));
end
end
Run Code Online (Sandbox Code Playgroud)
像这样称呼它
tree = xmlread( xmlfile );
removeIndentNodes( tree.getChildNodes );
Run Code Online (Sandbox Code Playgroud)