【问题标题】:How to read xml file with multiple sub nodes in java with SAX parser如何使用 SAX 解析器在 java 中读取具有多个子节点的 xml 文件
【发布时间】:2013-06-26 09:35:01
【问题描述】:

我怎样才能读取一个有节点的xml文件,然后又是子节点,这个子节点可以进一步有子节点

类似 XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<school>
    <student id="1">
        <firstname name="ankush">
            <test>sample </test>  //......here can be more sub nodes

        </firstname>
        <lastname>thakur</lastname>
        <email>beingjavaguy.gmail.com</email>
        <phone>7678767656</phone>
    </student>

</school>

我用来阅读的代码:

public class ReadXml extends DefaultHandler{

public void getXml(){
        try {

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

            DefaultHandler defaultHandler = new DefaultHandler(){

                String firstNameTag="close";
                String lastNameTag="close";
                String emailTag="close";
                String phoneTag="close";
                String testTag="close";

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

                    if (qName.equalsIgnoreCase("FIRSTNAME")) {
                        firstNameTag = "open";
                    }
                    if (qName.equalsIgnoreCase("TEST")) {
                        testTag = "open";
                    }

                    if (qName.equalsIgnoreCase("LASTNAME")) {
                        lastNameTag = "open";
                    }
                    if (qName.equalsIgnoreCase("EMAIL")) {
                        emailTag = "open";
                    }
                    if (qName.equalsIgnoreCase("PHONE")) {
                        phoneTag = "open";
                    }
                }


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

                    if (firstNameTag.equals("open")) {
                        System.out.println("First Name : " + new String(ch, start, length));
                    }
                    if (testTag.equals("open")) {
                        System.out.println("Test Name : " + new String(ch, start, length));
                    }

                    if (lastNameTag.equals("open")) {
                        System.out.println("Last Name : " + new String(ch, start, length));
                    }
                    if (emailTag.equals("open")) {
                        System.out.println("Email : " + new String(ch, start, length));
                    }
                    if (phoneTag.equals("open")) {
                        System.out.println("Phone : " + new String(ch, start, length));
                    }
                }


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

                    if (qName.equalsIgnoreCase("firstName")) {
                        firstNameTag = "close";
                    }
                    if (qName.equalsIgnoreCase("test")) {
                        testTag = "close";
                    }

                    if (qName.equalsIgnoreCase("lastName")) {
                        lastNameTag = "close";
                    }
                    if (qName.equalsIgnoreCase("email")) {
                        emailTag = "close";
                    }
                    if (qName.equalsIgnoreCase("phone")) {
                        phoneTag = "close";
                    }
                }
            };

            saxParser.parse("xmlToRead/student.xml", defaultHandler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

但是输出

First Name : 

First Name : sample 
Test Name : sample 
First Name : 


Last Name : thakur
Email : beingjavaguy.gmail.com
Phone : 7678767656

任何帮助都将不胜感激。

【问题讨论】:

  • 这只包含单个节点
  • 使用dom解析器将xml转换为Document对象..
  • 我不想使用 dom 解析器 ...这只是一个示例,我将拥有大约 1 gb 的 lagre xml 文件
  • 唯一的办法就是使用解析器

标签: java xml xml-parsing sax saxparser


【解决方案1】:

作为一种中间方式,可以使用 DOM4J 处理子树,然后将它们分离,从而最大限度地减少内存消耗:

    SAXReader reader = new SAXReader();

    reader.addHandler("/school/student", new ElementHandler() {

        @Override
        public void onStart(ElementPath elementPath) {
            // nothing
        }

        @Override
        public void onEnd(ElementPath elementPath) {
            Element student = elementPath.getCurrent();
            /*
             * process the current student, then detach it from the tree
             */
            student.detach();
        }
    });

    reader.read(...));

这里,文档一次只包含一个 元素。

【讨论】:

    【解决方案2】:

    您要求我们教您如何编写 SAX 应用程序。有关于该主题的书籍和教程:阅读它们。请注意,这并不容易。 Elliotte Rusty Harold 关于 XML 和 Java 的书非常出色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2016-10-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多