【问题标题】:differentiating between empty textnode and textnode with whitespaces用空格区分空文本节点和文本节点
【发布时间】: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


【解决方案1】:

这里有一个简短的表达方式可能对你有所帮助:

<(\w+?>)[^\S]*<\/\1

这将选择任何为空的文本节点。

如果你不想选择标签,就用这个:

<(?<=(\w+?>))[^\S]*(?=<\/\1)

但是第二个无法识别:

<books></books>

例如,但在这种情况下,我建议简单地使用:

><

作为你的表达来分别找到那些。

【讨论】: