在验证xml文件时,我想记录任何内容为空的文本节点。换行符\n也被认为是texnode,但这不是我想要证明的。在下面的代码中:'parent‘有两个我不感兴趣的内容'\n’的文本节点。'elem1‘的内容是'\n\n',这是一个错误,必须报告。“elem2”包含有效内容。“book”的内容为空,必须报告。
在我的第一次尝试中,我在每个text-node中搜索\n\t\r并忽略它们。但是这样我也会忽略elem1,它应该被报告为错误。
我做错了什么?(注意:我必须在没有xsd-validation的情况下解决这个问题)
更新1):我已经在元素之间添加了更多\n。现在,第一个'parent‘节点有5个文本节点,其内容为:\n
<root>
<parent>
<elem1>
</elem1>
<elem2>good content of el2</elem2>
<elem3> half so good
contentof el3</elem3>
</parent>
<parent>
<elem1>
</elem1>
<elem2>good content</elem2>
<elem3>good</elem3>
<elem4></elem4>
</parent>
<book></book>
</root>更新2)为了更清晰:当调用者调用validate("//parent/*")时,我收集这个给定路径的所有节点,并返回一个节点列表。然后,我开始对每个节点及其子节点进行验证。
Nodelist result = xpathinstance.validate(path, currentNode, XPathConstants.NODESET)
for (int n = 0; n < result.getLength(); n++) {
validateThereAreNoGaps(result.item(n));
}在第一个‘parent’元素上,它显示了7个子元素(在更新示例之后)。element-tag之间的每个\n都被视为一个text-node。
作为下一个解决方案,我现在正在尝试将所有\n替换为"“,以摆脱它们...
发布于 2020-06-30 18:56:59
下面是一个简短的表达式,它可能会对你有所帮助:
<(\w+?>)[^\S]*<\/\1这将选择任何空的文本节点。
如果您不想选择标签,只需使用以下命令:
<(?<=(\w+?>))[^\S]*(?=<\/\1)然而,第二个不能识别:
<books></books>例如,但在这种情况下,我建议简单地使用:
><作为你的表达式来分别找到它们。
https://stackoverflow.com/questions/62655140
复制相似问题