2012-04-27 55 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://cn.voidcc.com/question/p-piaylrht-ro.html" target="_blank" title="BeautifulSoup递归解析数据和维护结构时输出"> BeautifulSoup递归解析数据和维护结构时输出 </a> </li> <li> 2. <a href="http://cn.voidcc.com/question/p-nwotnmju-rd.html" target="_blank" title="使用xml结构解析json结构"> 使用xml结构解析json结构 </a> </li> <li> 3. <a href="http://cn.voidcc.com/question/p-nqkhaxbr-gd.html" target="_blank" title="在Java中使用REGEX解析XML"> 在Java中使用REGEX解析XML </a> </li> <li> 4. <a href="http://cn.voidcc.com/question/p-zmzlspxa-vh.html" target="_blank" title="的Android/JAVA - 解析不同结构"> 的Android/JAVA - 解析不同结构 </a> </li> <li> 5. <a href="http://cn.voidcc.com/question/p-otcoiclq-eq.html" target="_blank" title="解析XML结构2"> 解析XML结构2 </a> </li> <li> 6. <a href="http://cn.voidcc.com/question/p-xjpbvlbf-vt.html" target="_blank" title="®同时解析XML"> ®同时解析XML </a> </li> <li> 7. <a href="http://cn.voidcc.com/question/p-vbgoniow-cq.html" target="_blank" title="复制时维护列表结构"> 复制时维护列表结构 </a> </li> <li> 8. <a href="http://cn.voidcc.com/question/p-wdpbttst-cn.html" target="_blank" title="投影和维护结构"> 投影和维护结构 </a> </li> <li> 9. <a href="http://cn.voidcc.com/question/p-rqlbdvbw-dw.html" target="_blank" title="XML解析速度减慢"> XML解析速度减慢 </a> </li> <li> 10. <a href="http://cn.voidcc.com/question/p-kguhyado-qq.html" target="_blank" title="保护XML解析器"> 保护XML解析器 </a> </li> <li> 11. <a href="http://cn.voidcc.com/question/p-tfejacqn-gn.html" target="_blank" title="JAVA - 解析XML"> JAVA - 解析XML </a> </li> <li> 12. <a href="http://cn.voidcc.com/question/p-dbwxhtty-cu.html" target="_blank" title="JAVA,Xml解析"> JAVA,Xml解析 </a> </li> <li> 13. <a href="http://cn.voidcc.com/question/p-vioyzkxp-mz.html" target="_blank" title="Java XML解析"> Java XML解析 </a> </li> <li> 14. <a href="http://cn.voidcc.com/question/p-owcafmvg-rr.html" target="_blank" title="Java XML解析"> Java XML解析 </a> </li> <li> 15. <a href="http://cn.voidcc.com/question/p-mhjsmwhy-vo.html" target="_blank" title="java,xml解析"> java,xml解析 </a> </li> <li> 16. <a href="http://cn.voidcc.com/question/p-rehxjieq-te.html" target="_blank" title="用重复结构解析XML"> 用重复结构解析XML </a> </li> <li> 17. <a href="http://cn.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://cn.voidcc.com/question/p-cuqebgtq-en.html" target="_blank" title="的NSDictionary解析HOWTO"> 的NSDictionary解析HOWTO </a> </li> <li> 19. <a href="http://cn.voidcc.com/question/p-vivvixww-ps.html" target="_blank" title="在Java中读取和解析任意的xml结构?"> 在Java中读取和解析任意的xml结构? </a> </li> <li> 20. <a href="http://cn.voidcc.com/question/p-ptlcbxjr-gq.html" target="_blank" title="Java - 如何解析无尽的递归结构的XML?"> Java - 如何解析无尽的递归结构的XML? </a> </li> <li> 21. <a href="http://cn.voidcc.com/question/p-cfcitumh-po.html" target="_blank" title="Java的DOM解析工作不深XML结构"> Java的DOM解析工作不深XML结构 </a> </li> <li> 22. <a href="http://cn.voidcc.com/question/p-gmxgbjmb-v.html" target="_blank" title="解析XML时检索XML"> 解析XML时检索XML </a> </li> <li> 23. <a href="http://cn.voidcc.com/question/p-ogcvohrp-dk.html" target="_blank" title="通过REGEX在MySQL中解析结果"> 通过REGEX在MySQL中解析结果 </a> </li> <li> 24. <a href="http://cn.voidcc.com/question/p-xhgdovdp-hm.html" target="_blank" title="xml解析+ Java ME"> xml解析+ Java ME </a> </li> <li> 25. <a href="http://cn.voidcc.com/question/p-ropsagii-vs.html" target="_blank" title="Java和解析XML"> Java和解析XML </a> </li> <li> 26. <a href="http://cn.voidcc.com/question/p-trksztex-hd.html" target="_blank" title="JAVA DOM XML解析"> JAVA DOM XML解析 </a> </li> <li> 27. <a href="http://cn.voidcc.com/question/p-ypvfthps-ow.html" target="_blank" title="Java的XML解析"> Java的XML解析 </a> </li> <li> 28. <a href="http://cn.voidcc.com/question/p-mdiuaghk-y.html" target="_blank" title="使用Java解析文档结构"> 使用Java解析文档结构 </a> </li> <li> 29. <a href="http://cn.voidcc.com/question/p-cknlzgux-tz.html" target="_blank" title="按维护顺序快速解析json"> 按维护顺序快速解析json </a> </li> <li> 30. <a href="http://cn.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=1652515421853"></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 sidebar panel panel-default"> <div class="panel-heading font-bold"> 每日一句 </div> <div class="panel-body m-b-sm m-t-sm clearfix"> 每一个你不满意的现在,都有一个你没有努力的曾经。 </div> </div> <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://cn.voidcc.com/question/p-yioejhnx-tx.html" target="_blank" title="多层次按菜单角4"> 多层次按菜单角4 </a> </li> <li class="side_article_list_item"> 2. <a href="http://cn.voidcc.com/question/p-drsvokxw-tx.html" target="_blank" title="Yodlee providerAccounts REST端点凭证"> Yodlee providerAccounts REST端点凭证 </a> </li> <li class="side_article_list_item"> 3. <a href="http://cn.voidcc.com/question/p-mjfchfvz-ty.html" target="_blank" title="体面性能Gem5系统要求"> 体面性能Gem5系统要求 </a> </li> <li class="side_article_list_item"> 4. <a href="http://cn.voidcc.com/question/p-mjhxzvea-ty.html" target="_blank" title="熊猫:从行的特定列中选择值"> 熊猫:从行的特定列中选择值 </a> </li> <li class="side_article_list_item"> 5. <a href="http://cn.voidcc.com/question/p-sosxhfqn-tv.html" target="_blank" title="Bypass Itunes Connect Testflight应用程序-β审查"> Bypass Itunes Connect Testflight应用程序-β审查 </a> </li> <li class="side_article_list_item"> 6. <a href="http://cn.voidcc.com/question/p-uwbbnehm-rx.html" target="_blank" title="AsyncTask致命异常#1"> AsyncTask致命异常#1 </a> </li> <li class="side_article_list_item"> 7. <a href="http://cn.voidcc.com/question/p-nqoufjid-ro.html" target="_blank" title="ASP.NET MVC jQuery的负载用户控件尊重命名空间"> ASP.NET MVC jQuery的负载用户控件尊重命名空间 </a> </li> <li class="side_article_list_item"> 8. <a href="http://cn.voidcc.com/question/p-rrisuybd-rc.html" target="_blank" title="如何将批处理文件中find命令的输出捕获到变量中"> 如何将批处理文件中find命令的输出捕获到变量中 </a> </li> <li class="side_article_list_item"> 9. <a href="http://cn.voidcc.com/question/p-kecvahbx-qt.html" target="_blank" title="视图可以从活动中获得结果吗?"> 视图可以从活动中获得结果吗? </a> </li> <li class="side_article_list_item"> 10. <a href="http://cn.voidcc.com/question/p-uzdjctva-pp.html" target="_blank" title="另一个DropDownList选择项目问题"> 另一个DropDownList选择项目问题 </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://cn.voidcc.com/question/p-piaylrht-ro.html" target="_blank" title="BeautifulSoup递归解析数据和维护结构时输出"> BeautifulSoup递归解析数据和维护结构时输出 </a> </li> <li class="side_article_list_item"> 2. <a href="http://cn.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://cn.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://cn.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://cn.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://cn.voidcc.com/question/p-xjpbvlbf-vt.html" target="_blank" title="®同时解析XML"> ®同时解析XML </a> </li> <li class="side_article_list_item"> 7. <a href="http://cn.voidcc.com/question/p-vbgoniow-cq.html" target="_blank" title="复制时维护列表结构"> 复制时维护列表结构 </a> </li> <li class="side_article_list_item"> 8. <a href="http://cn.voidcc.com/question/p-wdpbttst-cn.html" target="_blank" title="投影和维护结构"> 投影和维护结构 </a> </li> <li class="side_article_list_item"> 9. <a href="http://cn.voidcc.com/question/p-rqlbdvbw-dw.html" target="_blank" title="XML解析速度减慢"> XML解析速度减慢 </a> </li> <li class="side_article_list_item"> 10. <a href="http://cn.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://cn.voidcc.com/contact">联系我们</a></li> <li>© 2020 CN.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>