我正在用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,但是由于未解决的原因也没有用...我已经问过XSLT实现的问题......
无论如何,我非常感谢提示/提示/解决方案如何使用正则表达式和Java来解决这个问题...
答案 0 :(得分:1)
我不建议使用正则表达式来操纵XML。
替代方法
您可以使用利用StreamFilter
来减少文档并仍保持有效结构的StAX解析器。
StreamFilter
如何运作
StreamFilter
收到来自XMLStreamReader
的事件事件,如果您希望报告的事件返回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