2014-01-17 51 views
-1

我對XMLParsing非常陌生。 今天坐在工作中,沒有管理解析文件並將其放入arrayList中。如何解析此XML文件以及使用哪個解析器?

我的文件看起來有點像這樣

<type> 
<OBJECT_TYPE>horse</OBJECT_TYPE> 
    <prop>blabla</prop> 
    <param>black</param> 
    <OBJECT_TYPE>cat</OBJECT_TYPE> 
    <prop>blabla</prop> 
    <param>black</param> 
    <OBJECT_TYPE>car</OBJECT_TYPE> 
    <prop>blabla</prop> 
    <param>black</param> 
</type> 

但很多時間更長,沒有這些內容。 我試圖使用SaxParser但沒有成功。 我已經閱讀了幾乎所有的SaxParser turials,但是所有的解析xml都有attibutes,我的XML沒有任何屬性。

因此,對於這種XML,我應該使用哪種解析器來將其保存到ArrayList中? 我只想列出我的OBJECT_TYPES沒有別的。沒有道具和沒有參數。

+0

如果你想要的是獲得OBJECT_TYPE元素文本,SAX是矯枉過正的。使用XPath:查看我的答案http://stackoverflow.com/a/19407505/217324 –

+0

SAX不是最好的選擇,除非您處理可笑大小的XML文檔......對於XML處理領域的最新狀態,您將會看到沒有更多的比vtd-xml ...它比DOM,SAX更好,並且幾乎可以在任何可能的情況下拉入... –

回答

1

這是正路

import java.util.ArrayList; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class ReadXMLFile { 

    public static void main(String argv[]) { 
     final ArrayList<String> al=new ArrayList<String>(); 

    try { 

    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser saxParser = factory.newSAXParser(); 

    DefaultHandler handler = new DefaultHandler() { 

    boolean bfname = false; 
    boolean blname = false; 
    boolean bnname = false; 
    boolean bsalary = false; 

    public void startElement(String uri, String localName,String qName, 
       Attributes attributes) throws SAXException { 

     System.out.println("Start Element :" + qName); 

     if (qName.equalsIgnoreCase("OBJECT_TYPE")) { 
      bfname = true; 
     } 



    } 

    public void endElement(String uri, String localName, 
     String qName) throws SAXException { 

     System.out.println("End Element :" + qName); 

    } 

    public void characters(char ch[], int start, int length) throws SAXException { 

     if (bfname) { 

      al.add(new String(ch, start, length)); 
      bfname = false; 
     } 



    } 

    }; 

     saxParser.parse("C:\\Users\\Naren\\workspace\\Regex\\src\\test.xml", handler); 
     System.out.println(al); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    } 

} 

輸出

[馬,貓,汽車]

+0

你確定它能正常工作嗎?因爲我非常確定我是這樣做的,它只寫了這樣的內容:[email protected],[email protected] – Sembrano

+0

我現在不在工作,所以現在無法測試。 – Sembrano

+0

檢查它我現在只寫和測試..我已經張貼輸出也...它將工作.. – Naren

1

爲SAX解析這種格式的標準圖案將是

  • startElement
    • 如果標籤名稱被OBJECT_TYPE然後創建一個新的緩衝區(例如StringBuilder的)來收集的字符數據。
  • characters
    • 如果存在激活的緩衝器,字符的當前組塊附加到緩衝器
  • endElement
    • 如果標籤名稱是OBJECT_TYPE轉動緩衝成一個字符串並做任何你需要做的事情。

解析器將提供元素處理程序的characters方法的文本內容,但不保證給你連續文本的整個塊在一個單一的塊,這就是爲什麼你需要將其存儲在緩衝區中並在endElement處進行處理。

0

這是我如何解決它:

public void ParserForObjectTypes() throws SAXException, IOException, 
      ParserConfigurationException { 

     try { 
      FileInputStream file = new FileInputStream(new File(
        "xmlFiles/CoreDatamodel.xml")); 

      DocumentBuilderFactory builderFactory = DocumentBuilderFactory 
        .newInstance(); 

      DocumentBuilder builder = builderFactory.newDocumentBuilder(); 

      Document xmlDocument = builder.parse(file); 

      XPath xPath = XPathFactory.newInstance().newXPath(); 

      String expression = "//OBJECT_TYPE"; 
      NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(
        xmlDocument, XPathConstants.NODESET); 
      for (int i = 0; i < nodeList.getLength(); i++) { 


       model.addElement(nodeList.item(i).getFirstChild() 
         .getNodeValue()); 

      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } catch (XPathExpressionException e) { 
      e.printStackTrace(); 
     } 
    }