【问题标题】:Remove empty tags at XML using Java使用 Java 删除 XML 中的空标签
【发布时间】: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,并遍历所有元素。删除没有内容、没有子级和没有属性的元素。

标签: java 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2010-12-13
    • 2023-03-06
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多