Java正则表达式完全删除空xml节点和子节点

时间:2015-06-26 08:33:20

标签: java regex xml replaceall

我正在努力寻找最佳解决方案。以下是我的XML:

                <Dbtr>
                    <Nm>John doe</Nm>
                    <Id>
                        <OrgId>
                            <Othr>
                                <Id/>
                             </Othr>
                        </OrgId>
                    </Id>
                </Dbtr>

这应该像下面这样替换:

                <Dbtr>
                    <Nm>John doe</Nm>
                </Dbtr>

因此,应该省略所有空节点和没有任何值的子节点。 我正在使用以下表达,并且它不按照我的意愿工作

docStr = docStr.replaceAll("<(\\w+)></\\1>|<\\w+/>", ""); 

任何帮助都会非常感激。

编辑: 我正在创建这个XML(而不是解析它),这将被发送到清算所,由于这个空标记,清算中心将拒绝这个xml消息。我创建这个xml的方式不在我的手中我只是提供db的值,你可以看到一些值是空的,这段代码(我没有控制权)已经写出了xml标签,然后写了价值,我能控制的就是不写&#34; null&#34;。 对我来说最好的选择是获得像这样的输出xml并用一些regexp逻辑替换它并形成一个没有空标签的xml,它可以通过模式验证。

1 个答案:

答案 0 :(得分:0)

    String xml = ""
        + "<Dbtr>"
        + "    <Nm>John doe</Nm>"
        + "    <Id>"
        + "        <OrgId>"
        + "            <Othr>"
        + "                <Id/>"
        + "             </Othr>"
        + "        </OrgId>"
        + "    </Id>"
        + "</Dbtr>";
    while (true) {
        String repl = xml.replaceAll("<(\\w+)>\\s*</\\1>|<\\w+/>", "");
        if (repl.length() == xml.length())
            break;
        xml = repl;
    }
    System.out.println(xml);
    // -> <Dbtr>    <Nm>John doe</Nm>    </Dbtr>