2014-01-17 146 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(); 
     } 
    }