Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式完全删除空xml节点和子节点_Java_Regex_Xml_Replaceall - Fatal编程技术网

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

Java正则表达式完全删除空xml节点和子节点,java,regex,xml,replaceall,Java,Regex,Xml,Replaceall,我正在努力寻找最好的解决办法。下面是我的XML: <Dbtr> <Nm>John doe</Nm> <Id> <OrgId> <Othr> <

我正在努力寻找最好的解决办法。下面是我的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标记,然后写入值,我所能控制的就是不写入null。
现在对我来说,最好的办法是获得这样的输出xml,并用一些regexp逻辑替换它,形成一个没有空标记的xml,它可以通过模式验证

为此,您应该使用xml解析器。作为一般规则:不要使用正则表达式来重新格式化或解析xml或HTML。使用DOM解析,例如jsoup:我认为应该将该文档序列化为对象并在其上进行处理。使用正则表达式可能会破坏xml结构。虽然效率不高,但这也可以奏效。谢谢
    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>