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 サービスからの検索の一致ごとに 1 回)。

上記の構造のセグメントのみを値とともに残し、他のタグを含むタグ間の他のすべてを削除<title><author>ながら、正規表現を使用してドキュメントを解析しようとしましたが、取得できませんそれは私の人生のために働くために...

以前は XSLT を使用して試してみましたが、未解決の理由でうまくいきませんでした... XSLT の実装については既に質問しました...

とにかく、正規表現とJavaを使用してこの問題を解決する方法として、ヒント/ヒント/解決策をいただければ幸いです...

4

1 に答える 1

1

正規表現を使用して XML を操作することはお勧めしません。

代替アプローチ

を活用する StAX パーサーを使用StreamFilterして、ドキュメントを削減し、有効な構造を維持することができます。

仕組み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
于 2012-04-27T15:53:37.830 に答える