2015-10-19 104 views
1

我有XML文件,我想獲取節點的位置。Java Xml元素 - 獲取文件中的節點位置

<Root> 
    <Node1></Node1> 
</Root> 

我想得到1)開始和結束位置; 2)開始和結束行

如何做到這一點?由於

+3

可能的重複[節點位置在xml-Java](http://stackoverflow.com/questions/13260552/node-position-in-xml-java) – markpsmith

回答

0

創建跟蹤位置信息,你想有一個讀者:

static public class MyReader extends Reader { 

    final private Reader internalReader; 
    private int pos; 
    private int line; 

    public MyReader(Reader internalReader) { 
     this.internalReader = internalReader; 
    } 

    public int getPos() { 
     return pos; 
    } 

    public int getLine() { 
     return line; 
    } 


    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException { 

     int chars_read = internalReader.read(cbuf, off, 1); 
     pos += chars_read; 
     if(cbuf[off] =='\n' && chars_read > 0) { 
      line++; 
     } 
     return chars_read; 
    } 

    @Override 
    public void close() throws IOException { 
     internalReader.close(); 
    } 
} 

使用與存儲在與元素相關的一些數據結構中的位置信息的ContentHandler。

String xmlString = "<Root>\n" 
      + " <Node1></Node1>\n" 
      + "</Root>"; 
    StringReader strReader = new StringReader(xmlString); 
    MyReader reader = new MyReader(strReader); 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser parser = factory.newSAXParser(); 
    XMLReader xmlreader = parser.getXMLReader(); 
    Map<String,List<Integer>> startMap = new HashMap<>(); 
    Map<String,List<Integer>> endMap = new HashMap<>(); 
    Map<String,List<Integer>> startLineMap = new HashMap<>(); 
    Map<String,List<Integer>> endLineMap = new HashMap<>(); 

    DefaultHandler handler = new DefaultHandler() { 

     @Override 
     public void endElement(String uri, String localName, String qName) throws SAXException { 
      super.endElement(uri, localName, qName); //To change body of generated methods, choose Tools | Templates. 
      List<Integer> l = endMap.get(qName); 
      if(null == l) { 
       l = new ArrayList<>(); 
      } 
      l.add(reader.getPos()); 
      endMap.put(qName, l); 
      List<Integer> ll = endLineMap.get(qName); 
      if(null == ll) { 
       ll= new ArrayList<>(); 
      } 
      ll.add(reader.getLine()); 
      endLineMap.put(qName, ll); 
     } 

     @Override 
     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
      super.startElement(uri, localName, qName, attributes); //To change body of generated methods, choose Tools | Templates. 
      List<Integer> l = startMap.get(qName); 
      if(null == l) { 
       l = new ArrayList<>(); 
      } 
      l.add(reader.getPos()); 
      startMap.put(qName, l); 
      List<Integer> ll = startLineMap.get(qName); 
      if(null == ll) { 
       ll= new ArrayList<>(); 
      } 
      ll.add(reader.getLine()); 
      startLineMap.put(qName, ll); 
     } 
    }; 
    xmlreader.setContentHandler(handler); 
    xmlreader.parse(new InputSource(reader)); 
    System.out.println("startMap = " + startMap); 
    System.out.println("endMap = " + endMap); 
    System.out.println("startLineMap = " + startLineMap); 
    System.out.println("endLineMap = " + endLineMap);