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

标签 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,但是由于 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/

相关文章:

java - 什么是NullPointerException,我该如何解决?

java - 导出为 XML,包括嵌入式类

java - 更改登录按钮上的 Facebook Logo 颜色

java - JAXB 解码 xml 而不使用 package-info.java

regex - 可以使用 Perl 的 grep 和正则表达式返回捕获

php - 正则表达式:尝试使用无重音关键字修改重音句子

java - GlassFish numconnused 与实际打开的连接数

Java if 语句总是返回 true

javax.mail : Get nested attachments in EML attachment

正则表达式字符跨度