【发布时间】:2020-10-20 14:53:42
【问题描述】:
在验证 xml 文件时,我想记录任何内容为空的文本节点。换行符 \n 也被认为是 texnode 但这不是我想要证明的。在以下代码中: 'parent' 有两个我不感兴趣的内容 '\n' 的文本节点。 'elem1'的内容是'\n\n',这是一个错误,必须报告。 'elem2' 的内容有效。 “图书”的内容为空,必须报告。
在我的第一次尝试中,我在每个文本节点中搜索 [\n\t\r] 并且会忽略它们。但是这样我也会忽略应该报告为错误的elem1。
我做错了什么? (注意:我必须在没有 xsd-validation 的情况下解决这个问题)
更新 1):我在元素之间添加了更多 \n。现在第一个“父”节点有 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));
}
Wenn 我到达了第一个“父”元素,它显示了 7 个子元素(示例更新后)。元素标签之间的每个 \n 都被视为一个文本节点。
作为下一个解决方案,我现在尝试将所有 \n 替换为 "" 以摆脱它们...
【问题讨论】:
-
如果我没看错,您希望找到所有仅包含空格的文本节点,但忽略所有恰好包含 1 个换行符的文本节点,对吧?
-
@Joachim Sauer 不完全是一个。为了便于阅读,xml 文件的作者可能在元素之间插入了几行新行。
-
@Mandy8055 使用解析器会期望文档的模型定义,我从未在验证代码中使用过。
-
但是你说
elem1是一个错误,就是这样:两个换行符,为什么添加空格可读性就可以了? -
@Mandy8055 我终于找到了办法。您如何看待这个问题:elem1、elem2 和 elem3 中的文本节点既没有下一个兄弟节点,也没有前一个兄弟节点。但是“父”中的文本节点(例如 \n )具有下一个兄弟节点,即
。 'parent' 的最后一个文本节点(也是 \n )只有前一个兄弟,但没有下一个 silbing。
标签: java regex whitespace text-normalization