Java REGEX XML解析/删减,同时保持结构HowTo

时间:2012-04-27 13:25:07

标签: java xml regex

我正在用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来解决这个问题...

1 个答案:

答案 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