0

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

4

1 回答 1

1

我不建议使用正则表达式来操作 XML。

替代方法

您可以使用 StAX 解析器,它利用 aStreamFilter来减少文档并仍然保持有效的结构。

如何StreamFilter工作

AStreamFilter从 接收事件事件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
于 2012-04-27T15:53:37.830 回答