使用 Java 删除 XML 中的空标签

Posted

技术标签:

【中文标题】使用 Java 删除 XML 中的空标签【英文标题】:Remove empty tags at XML using Java 【发布时间】:2015-06-01 15:31:39 【问题描述】:

我正在为 servlet 提供一些功能,我想做的一件事是,当接收 InputStream(基本上是解析为 XML 格式的 PDF 文档)时,将该数据设置为 String 对象,然后我尝试删除所有的空标签,但到目前为止我还没有得到任何好的结果:

这是 servlet 正在接收的数据

    <form1>
        <GenInfo>
            <Section1>
                <EmployeeDet>
                    <Title>999990000</Title>
                    <Firstname>MIKE</Firstname>
                    <Surname>SPENCER</Surname>
                    <CoName/>
                    <EmpAdd>
                        <Address><Add1/><Add2/><Town/><County/><Pcode/></Address>
                    </EmpAdd>
                    <PosHeld>DEVELOPER</PosHeld>
                    <Email/>
                    <ConNo/>
                    <Nationality/>
                    <PPSNo/>
                    <EmpNo/>
                </EmployeeDet>
            </Section1>
        </GenInfo>
    </form1>

最终的结果应该是这样的:

    <form1>
        <GenInfo>
            <Section1>
                <EmployeeDet>
                    <Title>999990000</Title>
                    <Firstname>MIKE</Firstname>
                    <Surname>SPENCER</Surname>
                    <PosHeld>DEVELOPER</PosHeld>
                </EmployeeDet>
            </Section1>
        </GenInfo>
    </form1>

如果这是一个重复的问题,我深表歉意,但我对类似的帖子进行了一些研究,但没有一个可以为我提供正确的方法,这就是我在单独的帖子中问你的原因。

提前谢谢你。

【问题讨论】:

请说明您已经采取的方法。 您使用什么 API 来解析 XML?解析 XML,并遍历所有元素。删除没有内容、没有子级和没有属性的元素。 【参考方案1】:

这是regex 做你想做的事的方式。我确信可能有一些我没有想到的“边缘”案例,但有时你无法分辨何时使用regex。此外,DOM 解析器可能是最好的方法。

public static void main(String[] args) throws Exception 
    String[] patterns = new String[] 
        // This will remove empty elements that look like <ElementName/>
        "\\s*<\\w+/>", 
        // This will remove empty elements that look like <ElementName></ElementName>
        "\\s*<\\w+></\\w+>", 
        // This will remove empty elements that look like 
        // <ElementName>
        // </ElementName>
        "\\s*<\\w+>\n*\\s*</\\w+>"
    ;

    String xml = "    <form1>\n" +
                    "        <GenInfo>\n" +
                    "            <Section1>\n" +
                    "                <EmployeeDet>\n" +
                    "                    <Title>999990000</Title>\n" +
                    "                    <Firstname>MIKE</Firstname>\n" +
                    "                    <Surname>SPENCER</Surname>\n" +
                    "                    <CoName/>\n" +
                    "                    <EmpAdd>\n" +
                    "                        <Address><Add1/><Add2/><Town/><County/><Pcode/></Address>\n" +
                    "                    </EmpAdd>\n" +
                    "                    <PosHeld>DEVELOPER</PosHeld>\n" +
                    "                    <Email/>\n" +
                    "                    <ConNo/>\n" +
                    "                    <Nationality/>\n" +
                    "                    <PPSNo/>\n" +
                    "                    <EmpNo/>\n" +
                    "                </EmployeeDet>\n" +
                    "            </Section1>\n" +
                    "        </GenInfo>\n" +
                    "    </form1>";

    for (String pattern : patterns) 
        Matcher matcher = Pattern.compile(pattern).matcher(xml);
        xml = matcher.replaceAll("");
    

    System.out.println(xml);

结果:

    <form1>
        <GenInfo>
            <Section1>
                <EmployeeDet>
                    <Title>999990000</Title>
                    <Firstname>MIKE</Firstname>
                    <Surname>SPENCER</Surname>
                    <PosHeld>DEVELOPER</PosHeld>
                </EmployeeDet>
            </Section1>
        </GenInfo>
    </form1>

【讨论】:

非常感谢!这就是我一直在寻找的。​​span> @JoseBerciano 不客气...请点击我的答案的复选标记,以便您的问题得到解决并从未回答的列表中删除。 如果标签是 则失败。你能帮我找到它的正则表达式吗 同样的问题@Ramesh你找到解决办法了吗?【参考方案2】:

您要做的是递归地遍历所有节点。一旦你找到一片叶子,它就是空的,只需将其移除即可。

有一个非常好的使用DOM解析器的例子here

【讨论】:

以上是关于使用 Java 删除 XML 中的空标签的主要内容,如果未能解决你的问题,请参考以下文章

使用 jackson-dataformat-xml 库将 XML 中的空标签转换为 java 属性

删除 innerXML 后,如何删除 C# 中的空标签?

删除 SQL Server 中不同级别的空 XML 标记

xml到json转换中的空标签

XML反序列化处理具有默认值的空标签

如果标签不存在,XSLT 处理 CSV 的空单元格