我正在用 Java 编写 RESTful Web 服务。 这个想法是“削减”一个XML文档,去掉所有不需要的内容(~98%),只留下我们感兴趣的标签,同时保持文档的结构,如下(我无法提供实际的)出于保密原因,XML 内容):
<sear:SEGMENTS xmlns="http://www.exlibrisgroup.com/xsd/primo/primo_nm_bib" xmlns:sear="http://www.exlibrisgroup.com/xsd/jaguar/search">
<sear:JAGROOT>
<sear:RESULT>
<sear:DOCSET IS_LOCAL="true" TOTAL_TIME="176" LASTHIT="9" FIRSTHIT="0" TOTALHITS="262" HIT_TIME="11">
<sear:DOC SEARCH_ENGINE_TYPE="Local Search Engine" SEARCH_ENGINE="Local Search Engine" NO="1" RANK="0.086826384" ID="2347460">
[
<PrimoNMBib>
<record>
<display>
<title></title>
</display>
<sort>
<author></author>
</sort>
</record>
</PrimoNMBib>
]
</sear:DOC>
</sear:DOCSET>
</sear:RESULT>
</sear:JAGROOT>
</sear:SEGMENTS>
当然,这只是我们感兴趣的标签的结构 - 还有数百个标签,但它们是无关紧要的。
方括号 ( []
) 不是 XML 的一部分,表示元素 <PrimoNMBib></PrimoNMBib>
是子列表的元素,并且出现多次 - 来自 RESTFUL 服务的搜索的每次匹配出现一次。
我一直在尝试使用正则表达式解析文档,以便仅保留如上所示的结构段以及 <title>
的值。和<author>
虽然删除了标签之间的所有其他内容(包括其他标签),但我无法让它为我的一生工作......
以前我尝试过使用 XSLT,但是由于 Unresolved 原因也不起作用...我已经提出了有关 XSLT 实现的问题...
无论如何,我非常感谢关于如何使用正则表达式和 Java 解决这个问题的提示/提示/解决方案...
最佳答案
我不建议使用正则表达式来操作 XML。
替代方法
您可以使用 StAX 解析器,利用 StreamFilter
来缩减文档并仍然保持有效的结构。
StreamFilter
的工作原理
StreamFilter
接收来自 XMLStreamReader
的 event 事件,如果您希望报告该事件,则返回 true,否则返回 false。在下面的示例中,StreamFilter
将拒绝 "http://www.exlibrisgroup.com/xsd/jaguar/search"
命名空间中的任何内容。您将需要调整逻辑以使其符合您的用例的要求。
演示
package forum10351473;
import java.io.FileReader;
import javax.xml.stream.*;
public class Demo {
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("src/forum10351473/input.xml"));
xsr = xif.createFilteredReader(xsr, new StreamFilter() {
private boolean reportContent = false;
@Override
public boolean accept(XMLStreamReader reader) {
if(reader.isStartElement() || reader.isEndElement()) {
reportContent = !"http://www.exlibrisgroup.com/xsd/jaguar/search".equals(reader.getNamespaceURI());
}
return reportContent;
}
});
// The XMLStreamReader (xsr) will now only report the events you care about.
// You can process the XMLStreamReader yourself or pass as input to something
// like JAXB.
while(xsr.hasNext()) {
if(xsr.isStartElement()) {
System.out.println(xsr.getLocalName());
}
xsr.next();
}
}
}
输出
PrimoNMBib
record
display
title
sort
author
关于Java REGEX XML 解析/缩减同时保持结构 HowTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10351473/