2012-04-27 57 views
0

我正在用Java編寫一個RESTful Web服務。 這個想法是「裁減」一個XML文檔,去掉所有不需要的內容(〜98%),只留下我們感興趣的標籤,同時保持文檔的結構,如下所示(我無法提供出於保密原因實際的XML內容):Java REGEX XML解析/裁減同時維護結構HowTo

<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

我很遺憾聽說爲此設計的XSLT不適合您。用正則表達式來做它聽起來非常困難。事實上,除了使用XML解析庫之外,其他任何方式聽起來都很難。也許像製作一個[SAXParser](http://docs.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParser.html)並構建一堆祖先標籤可能會有所幫助? – 2012-04-27 13:30:03

+0

非常感謝Rob。也許你能夠建議如何用XSLT解決這個問題?也許你會能夠爲我的XSLT實現建議一些東西?:http://stackoverflow.com/questions/10340023/restful-glassfish-xml-xslt-stylesheet-java-transformation-produces-empty-output – Piotr 2012-04-27 13:39:44

+0

如果有保證的話標籤是一個獨立的行,並刪除不必要的標籤不會制止xml結構的有效性,你可以使用正則表達式的腳本(perl,bash,sed,python等)來讀取這些行,不包含所需標籤的開口和結尾。 – 2012-04-27 13:44:33

回答

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 
+0

嗨布萊斯,非常感謝您的提示!我將如何去包含PrimoNMBib的父元素? :) – Piotr 2012-04-27 16:28:58

+0

你想要包含'sear:DOC'呢?這可以通過'accept'方法來控制。您只需添加何時接受/拒絕事件的邏輯即可。 – 2012-04-27 16:35:40

+0

是的,我想包含所有父標記,包括以及文本值和<author>。你能幫我嗎? :) – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/750325/">Piotr</a></span> <span>2012-04-27 16:47:53</span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="4319274062" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="clearfix"> </div> <div class="relative-box"> <div class="relative">相關問題</div> <ul class="relative_list"> <li> 1. <a href="http://hk.voidcc.com/question/p-piaylrht-ro.html" target="_blank" title="BeautifulSoup遞歸解析數據和維護結構時輸出"> BeautifulSoup遞歸解析數據和維護結構時輸出 </a> </li> <li> 2. <a href="http://hk.voidcc.com/question/p-nwotnmju-rd.html" target="_blank" title="使用xml結構解析json結構"> 使用xml結構解析json結構 </a> </li> <li> 3. <a href="http://hk.voidcc.com/question/p-nqkhaxbr-gd.html" target="_blank" title="在Java中使用REGEX解析XML"> 在Java中使用REGEX解析XML </a> </li> <li> 4. <a href="http://hk.voidcc.com/question/p-zmzlspxa-vh.html" target="_blank" title="的Android/JAVA - 解析不同結構"> 的Android/JAVA - 解析不同結構 </a> </li> <li> 5. <a href="http://hk.voidcc.com/question/p-otcoiclq-eq.html" target="_blank" title="解析XML結構2"> 解析XML結構2 </a> </li> <li> 6. <a href="http://hk.voidcc.com/question/p-xjpbvlbf-vt.html" target="_blank" title="®同時解析XML"> ®同時解析XML </a> </li> <li> 7. <a href="http://hk.voidcc.com/question/p-vbgoniow-cq.html" target="_blank" title="複製時維護列表結構"> 複製時維護列表結構 </a> </li> <li> 8. <a href="http://hk.voidcc.com/question/p-wdpbttst-cn.html" target="_blank" title="投影和維護結構"> 投影和維護結構 </a> </li> <li> 9. <a href="http://hk.voidcc.com/question/p-rqlbdvbw-dw.html" target="_blank" title="XML解析速度減慢"> XML解析速度減慢 </a> </li> <li> 10. <a href="http://hk.voidcc.com/question/p-kguhyado-qq.html" target="_blank" title="保護XML解析器"> 保護XML解析器 </a> </li> <li> 11. <a href="http://hk.voidcc.com/question/p-tfejacqn-gn.html" target="_blank" title="JAVA - 解析XML"> JAVA - 解析XML </a> </li> <li> 12. <a href="http://hk.voidcc.com/question/p-dbwxhtty-cu.html" target="_blank" title="JAVA,Xml解析"> JAVA,Xml解析 </a> </li> <li> 13. <a href="http://hk.voidcc.com/question/p-vioyzkxp-mz.html" target="_blank" title="Java XML解析"> Java XML解析 </a> </li> <li> 14. <a href="http://hk.voidcc.com/question/p-owcafmvg-rr.html" target="_blank" title="Java XML解析"> Java XML解析 </a> </li> <li> 15. <a href="http://hk.voidcc.com/question/p-mhjsmwhy-vo.html" target="_blank" title="java,xml解析"> java,xml解析 </a> </li> <li> 16. <a href="http://hk.voidcc.com/question/p-rehxjieq-te.html" target="_blank" title="用重複結構解析XML"> 用重複結構解析XML </a> </li> <li> 17. <a href="http://hk.voidcc.com/question/p-rtfsqdmn-sh.html" target="_blank" title="Oracle XML解析與Java XML解析"> Oracle XML解析與Java XML解析 </a> </li> <li> 18. <a href="http://hk.voidcc.com/question/p-cuqebgtq-en.html" target="_blank" title="的NSDictionary解析HOWTO"> 的NSDictionary解析HOWTO </a> </li> <li> 19. <a href="http://hk.voidcc.com/question/p-vivvixww-ps.html" target="_blank" title="在Java中讀取和解析任意的xml結構?"> 在Java中讀取和解析任意的xml結構? </a> </li> <li> 20. <a href="http://hk.voidcc.com/question/p-ptlcbxjr-gq.html" target="_blank" title="Java - 如何解析無盡的遞歸結構的XML?"> Java - 如何解析無盡的遞歸結構的XML? </a> </li> <li> 21. <a href="http://hk.voidcc.com/question/p-cfcitumh-po.html" target="_blank" title="Java的DOM解析工作不深XML結構"> Java的DOM解析工作不深XML結構 </a> </li> <li> 22. <a href="http://hk.voidcc.com/question/p-gmxgbjmb-v.html" target="_blank" title="解析XML時檢索XML"> 解析XML時檢索XML </a> </li> <li> 23. <a href="http://hk.voidcc.com/question/p-ogcvohrp-dk.html" target="_blank" title="通過REGEX在MySQL中解析結果"> 通過REGEX在MySQL中解析結果 </a> </li> <li> 24. <a href="http://hk.voidcc.com/question/p-xhgdovdp-hm.html" target="_blank" title="xml解析+ Java ME"> xml解析+ Java ME </a> </li> <li> 25. <a href="http://hk.voidcc.com/question/p-ropsagii-vs.html" target="_blank" title="Java和解析XML"> Java和解析XML </a> </li> <li> 26. <a href="http://hk.voidcc.com/question/p-trksztex-hd.html" target="_blank" title="JAVA DOM XML解析"> JAVA DOM XML解析 </a> </li> <li> 27. <a href="http://hk.voidcc.com/question/p-ypvfthps-ow.html" target="_blank" title="Java的XML解析"> Java的XML解析 </a> </li> <li> 28. <a href="http://hk.voidcc.com/question/p-mdiuaghk-y.html" target="_blank" title="使用Java解析文檔結構"> 使用Java解析文檔結構 </a> </li> <li> 29. <a href="http://hk.voidcc.com/question/p-cknlzgux-tz.html" target="_blank" title="按維護順序快速解析json"> 按維護順序快速解析json </a> </li> <li> 30. <a href="http://hk.voidcc.com/question/p-dnzeenjs-hh.html" target="_blank" title="Milti維XML解析:解析XML後獲得使用PHP"> Milti維XML解析:解析XML後獲得使用PHP </a> </li> </ul> </div> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3534119089"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img2.voidcc.com/voidso/script/side.js?t=1652515421930"></script> <script type="text/javascript" src="http://img2.voidcc.com/voidso/plugin/highlight/highlight.pack.js"></script> <link href="http://img2.voidcc.com/voidso/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row"> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- VOIDCC问答侧边栏广告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3862022848" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 最新問題 </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://hk.voidcc.com/question/p-poahpzgo-vb.html" target="_blank" title="當啓動vscode我的SO非常慢"> 當啓動vscode我的SO非常慢 </a> </li> <li class="side_article_list_item"> 2. <a href="http://hk.voidcc.com/question/p-chfkcgve-vc.html" target="_blank" title="BotAuth與Azure表存儲錯誤"> BotAuth與Azure表存儲錯誤 </a> </li> <li class="side_article_list_item"> 3. <a href="http://hk.voidcc.com/question/p-gvfbaewt-ve.html" target="_blank" title="Xcode,從故事板提取視圖到筆尖,最佳方法?"> Xcode,從故事板提取視圖到筆尖,最佳方法? </a> </li> <li class="side_article_list_item"> 4. <a href="http://hk.voidcc.com/question/p-wmmbchfn-vd.html" target="_blank" title="試圖在MAP中運行函數"> 試圖在MAP中運行函數 </a> </li> <li class="side_article_list_item"> 5. <a href="http://hk.voidcc.com/question/p-hetqvoko-up.html" target="_blank" title="指定具有絕對路徑的庫的GCC行爲是什麼"> 指定具有絕對路徑的庫的GCC行爲是什麼 </a> </li> <li class="side_article_list_item"> 6. <a href="http://hk.voidcc.com/question/p-gxxiswrz-uq.html" target="_blank" title="奇怪填充用的UIButton"> 奇怪填充用的UIButton </a> </li> <li class="side_article_list_item"> 7. <a href="http://hk.voidcc.com/question/p-aoydpuww-bkx.html" target="_blank" title="快速從mysql數據庫中選擇最後n條記錄os大小700Mb"> 快速從mysql數據庫中選擇最後n條記錄os大小700Mb </a> </li> <li class="side_article_list_item"> 8. <a href="http://hk.voidcc.com/question/p-mjlyetku-bho.html" target="_blank" title="從textinput傳遞playername到其他場景 - 反應本機"> 從textinput傳遞playername到其他場景 - 反應本機 </a> </li> <li class="side_article_list_item"> 9. <a href="http://hk.voidcc.com/question/p-euwxvdwk-bkk.html" target="_blank" title="intellij構建包含gradle依賴項的jar工件"> intellij構建包含gradle依賴項的jar工件 </a> </li> <li class="side_article_list_item"> 10. <a href="http://hk.voidcc.com/question/p-qgrztgod-zv.html" target="_blank" title="C#LINQ - 相較於浮表"> C#LINQ - 相較於浮表 </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> 相關問題</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://hk.voidcc.com/question/p-piaylrht-ro.html" target="_blank" title="BeautifulSoup遞歸解析數據和維護結構時輸出"> BeautifulSoup遞歸解析數據和維護結構時輸出 </a> </li> <li class="side_article_list_item"> 2. <a href="http://hk.voidcc.com/question/p-nwotnmju-rd.html" target="_blank" title="使用xml結構解析json結構"> 使用xml結構解析json結構 </a> </li> <li class="side_article_list_item"> 3. <a href="http://hk.voidcc.com/question/p-nqkhaxbr-gd.html" target="_blank" title="在Java中使用REGEX解析XML"> 在Java中使用REGEX解析XML </a> </li> <li class="side_article_list_item"> 4. <a href="http://hk.voidcc.com/question/p-zmzlspxa-vh.html" target="_blank" title="的Android/JAVA - 解析不同結構"> 的Android/JAVA - 解析不同結構 </a> </li> <li class="side_article_list_item"> 5. <a href="http://hk.voidcc.com/question/p-otcoiclq-eq.html" target="_blank" title="解析XML結構2"> 解析XML結構2 </a> </li> <li class="side_article_list_item"> 6. <a href="http://hk.voidcc.com/question/p-xjpbvlbf-vt.html" target="_blank" title="®同時解析XML"> ®同時解析XML </a> </li> <li class="side_article_list_item"> 7. <a href="http://hk.voidcc.com/question/p-vbgoniow-cq.html" target="_blank" title="複製時維護列表結構"> 複製時維護列表結構 </a> </li> <li class="side_article_list_item"> 8. <a href="http://hk.voidcc.com/question/p-wdpbttst-cn.html" target="_blank" title="投影和維護結構"> 投影和維護結構 </a> </li> <li class="side_article_list_item"> 9. <a href="http://hk.voidcc.com/question/p-rqlbdvbw-dw.html" target="_blank" title="XML解析速度減慢"> XML解析速度減慢 </a> </li> <li class="side_article_list_item"> 10. <a href="http://hk.voidcc.com/question/p-kguhyado-qq.html" target="_blank" title="保護XML解析器"> 保護XML解析器 </a> </li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://hk.voidcc.com/contact">聯系我們</a></li> <li>© 2020 HK.VOIDCC.COM</li> <li><a rel="nofollow" href="https://beian.miit.gov.cn/" target="_blank">沪ICP备13005482号-13</a></li> <li><script type="text/javascript" src="https://s9.cnzz.com/z_stat.php?id=1280098168&web_id=1280098168"></script></li> <li><a href="http://cn.voidcc.com/" target="_blank" title="程序问答园区">简体中文</a></li> <li><a href="http://hk.voidcc.com/" target="_blank" title="程序問答園區">繁體中文</a></li> <li><a href="http://ru.voidcc.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.voidcc.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.voidcc.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.voidcc.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.voidcc.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.voidcc.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.voidcc.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.voidcc.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.voidcc.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.voidcc.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.voidcc.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-77509369-5"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'UA-77509369-5'); </script> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?67d4731349f0b00136755b80364ce381"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>