java - 连接 SAX 检索到的两个字符串

标签 java xml sax saxparser

我有一个像这样的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Article>
    <ArticleTitle>Java-SAX Tutorial</ArticleTitle>
    <Author>
        <FamilyName>Yong</FamilyName>
        <GivenName>Mook</GivenName>
        <GivenName>Kim</GivenName>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </Author>
    <Author>
        <FamilyName>Low</FamilyName>
        <GivenName>Yin</GivenName>
        <GivenName>Fong</GivenName>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </Author>
</Article>

我已经尝试过 mkyong 教程 here 中的示例我可以使用 SAX 从中完美检索数据,它给了我:

Article Title : Java-SAX Tutorial
Given Name : Kim
Given Name : Mook
Family Name : Yong
Given Name : Yin
Given Name : Fong
Family Name : Low

但我希望它给我这样的东西:

Article Title : Java-SAX Tutorial
Author : Kim Mook Yong
Author : Yin Fong Low

换句话说,我想检索节点Author的一些子节点,而不是全部,将它们放入字符串变量中并显示它们。

这是我用来解析作者并尝试进行修改的类:

public class ReadAuthors {

    public void parse(String filePath) {

        try {

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

            DefaultHandler handler = new DefaultHandler() {

                boolean bFamilyName = false;
                boolean bGivenName = false;

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

                    if (qName.equalsIgnoreCase("FamilyName")) {
                        bFamilyName = true;
                    }

                    if (qName.equalsIgnoreCase("GivenName")) {
                        bGivenName = true;
                    }

            }

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

            }

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

                String fullName = "";

                String familyName = "";
                String givenName ="";

                if (bFamilyName) {
                    familyName = new String(ch, start, length);
                    fullName += familyName;
                    bFamilyName = false;
                }

                if (bGivenName) {
                    givenName = new String(ch, start, length);
                    fullName += " " + givenName;
                    bGivenName = false;
                }

                System.out.println("Full Name : " + fullName);

            }
             };

             saxParser.parse(filePath, handler);

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

}

通过此修改,它只提供 ArticleTitle 值,并且不会返回有关作者全名的任何内容。

我有另一个类用于解析 ArticleTitle 节点,它们都在主类中调用。

我做错了什么?我该如何解决它?

最佳答案

每次调用字符方法时,fullName 变量都会被覆盖。我认为你应该将该变量移出到处理程序中:当作者开始时用空字符串 init 并在结束时写出。连接应该像你一样工作。我还没有尝试过,但类似的东西应该有效:

public class ReadAuthors {

    public void parse(String filePath) {

        try {

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

            DefaultHandler handler = new DefaultHandler() {

                boolean bName = false;
                String fullName = "";

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

                    if (qName.equalsIgnoreCase("FamilyName")) {
                        bName = true;
                    }

                    if (qName.equalsIgnoreCase("GivenName")) {
                        bName = true;
                    }

                    if (qName.equalsIgnoreCase("Author")) {
                        fullName = "";
                    }

            }

            @Override
            public void endElement(String uri, String localName,
                String qName) throws SAXException {
                    if (qName.equalsIgnoreCase("Author")) {
                        System.out.println("Full Name : " + fullName);
                    }
            }

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

                String name = "";

                if (bName) {
                    name = new String(ch, start, length);
                    fullName += name;
                    bName = false;
                }

            }
             };

             saxParser.parse(filePath, handler);

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

}

关于java - 连接 SAX 检索到的两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28126247/

相关文章:

java - 如何从 xml 文件中获取字符串形式的 URL?

java - 使用 SAX 修改 XML 文件

java - 公开内部集合项时应该使用 Iterator 还是 Iterable?

java - 在 TransformerFactory 中设置安全处理会导致 XSL 中出现问题

java - 使用 OAuth 的 Google App Engine 身份验证

python - 根据 XML 架构 (xsd) 验证具有大文本元素的 XML

python - 使用 SAX/Python 解析 XML + 无验证

java - 如何使用java中的解析器从nmap XML字符串(IP,端口)获取信息

java - 显示来自 href 的图像

java - 在使用 va_arg 传递 char* 时,在 JNI 中将 char* 转换为 jstring