在java中读取xml文件,给出态度,返回节点路径

时间:2017-06-02 12:34:23

标签: java xml

以下是我的XML文件:

<a path="A">
 <b path="B">
   <c filename="C">1</c>
   <c filename="D">2</c>
   <c filename="E">3</c>
 </b>
</a>

我想要一个函数,如果我给1,它会返回A / B / C,

2→A / B / d

3→A / B / E

1 个答案:

答案 0 :(得分:0)

如何做到的一个例子

public static void main( String[] args ) throws Exception {
    String str = "<a path=\"A\"><b path=\"B\"><c filename=\"C\">1</c><c filename=\"D\">2</c><c filename=\"E\">3</c></b></a>";
    Map<String, String> map = new HashMap<>();
    Deque<String> stack = new LinkedList<>();
    StringBuilder sb = new StringBuilder();
    DefaultHandler sax = new DefaultHandler() {

        @Override
        public void startElement( String uri, String localName, String qName, Attributes attributes ) throws SAXException {
            String path = "?";
            for ( int index = 0 ; index < attributes.getLength() ; index += 1 ) {
                String localnameAttr = attributes.getLocalName( index );
                if ( localnameAttr.equals( "path" ) || localnameAttr.equals( "filename" ) ) {
                    path = attributes.getValue( index );
                    break;
                }
            }
            stack.offerLast( path );
        }

        @Override
        public void endElement( String uri, String localName, String qName ) throws SAXException {
            StringBuilder path = new StringBuilder();
            for ( String s : stack ) {
                path.append( s ).append( '/' );
            }
            if ( path.length() > 0 ) {
                path.setLength( path.length() - 1 );
                map.put( sb.toString(), path.toString() );
            }
            sb.setLength( 0 );
            stack.removeLast();
        }

        @Override
        public void characters( char[] ch, int start, int length ) throws SAXException {
            sb.append( ch, start, length );
        }

    };
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser saxPareser = spf.newSAXParser();
    saxPareser.parse( new ByteArrayInputStream( str.getBytes() ), sax );

    System.out.println( "1 => " + map.get( "1" ) );
    System.out.println( "2 => " + map.get( "2" ) );
    System.out.println( "3 => " + map.get( "3" ) );

}