2011-07-12 35 views
0

我在我的数据库(MYSQL)上有一个包含XML结构的字段,我想分析该字段以提取数据,我的想法是提取该字段并将其复制到文件中,然后解析它,但问题是我应该这样做超过200行(而且这个数字正在增长),这意味着我应该打开每一个文件来复制它的领域,消耗时间和内存,是他们的另一个解决方案吗?如何解析一个字段包含一个XML结构?

UPDATE 我曾尝试这个代码,但它产生一个错误:

if(var2.length()!=0) 
      { 
      System.out.println("---------------test1--------------"); 

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
       System.out.println("*********test2*********"); 
       InputSource is = new InputSource(new StringReader(var2)); 
       Document parse = builder.parse(is); 
       System.out.println("builder.parse"+builder.parse(is).toString()); 
    System.out.println("______test3_____"); 


      } 
      else 
        System.out.println("null"); 

     } 


      } 
      else 
        System.out.println("null"); 

错误:

---------------test1-------------- 
*********test2********* 
java.net.UnknownHostException: www.opensymphony.com 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
at java.net.Socket.connect(Socket.java:529) 
at java.net.Socket.connect(Socket.java:478) 
at sun.net.NetworkClient.doConnect(NetworkClient.java:163) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:394) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:529) 
at sun.net.www.http.HttpClient.<init>(HttpClient.java:233) 
at sun.net.www.http.HttpClient.New(HttpClient.java:306) 
at sun.net.www.http.HttpClient.New(HttpClient.java:323) 
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970) 
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911) 
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1282) 
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:283) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1194) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1003) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235) 
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284) 
at DAOKPI.Main.main(Main.java:88) 

回答

0

不要使用XML。用数据库表来表达数据。

+0

(作为对a的回应,自删除后,“我不明白!”评论):XML是存储数据的一种手段。数据库是存储数据的一种手段。不要将数据以XML格式存储在数据库中。只需将数据直接存储在数据库中即可。根据需要添加其他表格/行/列。 – Quentin

+0

,我无法在数据库中创建任何表的问题,它是我无法修改(由公司禁止)的数据库,我无法使用中间数据库 – rym

+0

这是一个管理问题。你应该试着解决这个问题,而不是用复杂和低效的黑客来解决它。 – Quentin

1

你在使用什么语法分析器? 您没有将内容保存到一个文件(即SAX):

saxParser.parse(new InputSource(new StringReader(yourXMLstring)); 

编辑:当然,如果可能的话,导入XML数据转换成正确的关系模式事先,像昆汀提及。