使用 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 不客气...请点击我的答案的复选标记,以便您的问题得到解决并从未回答的列表中删除。 如果标签是您要做的是递归地遍历所有节点。一旦你找到一片叶子,它就是空的,只需将其移除即可。
有一个非常好的使用DOM解析器的例子here
【讨论】:
以上是关于使用 Java 删除 XML 中的空标签的主要内容,如果未能解决你的问题,请参考以下文章