如何让Matlab读取正确数量的xml节点

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个节点

  1. 节点1:带有换行符和缩进空格的#text
  2. 节点2:"请求者"节点,其在数据部分中具有带有"John Doe"的#text子节点
  3. 节点3:带有换行符和缩进空格的#text
  4. 节点4:"项目"节点,该节点又在数据部分中具有带有"X"的#text子节点
  5. 节点5:带有换行符和缩进空格的#text

此函数为您删除所有这些无用的#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)