我正在使用 matlab 的 xmlread 内部函数读取一个简单的 xml 文件。
<root>
<ref>
<requestor>John Doe</requestor>
<project>X</project>
</ref>
</root>
但是当我调用 getChildren() 时ref
元素,它告诉我它有5孩子们。
它工作正常如果我将所有 XML 放入ONE line。 Matlab 告诉我ref
元素有2孩子们。
它似乎不喜欢元素之间的空格。
就算我跑规范化在 oXygen XML 编辑器中,我仍然得到相同的结果。因为规范化仍然留有空间。
Matlab 使用 java 和 xerces 来处理 xml 内容。
问题:
我该怎么做才能使我的 xml 文件保持人类可读的格式(不是全部在一行中),但仍然让 matlab 正确解析它?
代码更新:
filename='example01.xml';
docNode = xmlread(filename);
rootNode = docNode.getDocumentElement;
entries = rootNode.getChildNodes;
nEnt = entries.getLength
幕后的 XML 解析器正在为节点元素之间的所有空白创建 #text 节点。只要有换行符或缩进,它就会在节点的数据部分中创建一个带有换行符和后面缩进空格的#text 节点。因此,在您提供的 xml 示例中,当解析“ref”元素的子节点时,它返回 5 个节点
- 节点 1:带有换行符和缩进空格的#text
- 节点 2:“请求者”节点,该节点又具有一个数据部分中带有“John Doe”的 #text 子节点
- 节点 3:带有换行符和缩进空格的#text
- 节点 4:“project”节点,该节点又具有一个数据部分带有“X”的 #text 子节点
- 节点 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
像这样称呼它
tree = xmlread( xmlfile );
removeIndentNodes( tree.getChildNodes );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)