在StAX XMLStreamConstants.CHARACTERS事件中获取XML节点文本时出现问题

时间:2014-04-01 09:05:34

标签: java xml stax

在使用StAX和XMLStreamReader读取XML文件时,遇到了一个奇怪的问题。不确定它是错误还是我做错了什么。还在学习StAX。

所以问题是,

  1. XMLStreamConstants.CHARACTERS事件中,当我将节点文本收集为XMLStreamReader.getText()方法时。
  2. 如果有&,<,>甚至在节点文本中隐藏的东西,它只返回文本字符串的第一部分。 例如ABC & XYZ仅返回ABC
  3. 简化的Java来源:

        // Start StaX reader
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        try {
            XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inStream);
            int event = xmlStreamReader.getEventType();
            while (true) {
                switch (event) {
                    case XMLStreamConstants.START_ELEMENT:
                        switch (xmlStreamReader.getLocalName()) {
                            case "group":
                            // Do something
                                break;
                            case "source":
                                isSource = true;
                                break;
                            case "target":
                                isTarget = true;
                                break;
                            default:
                                isSource = false;
                                isTrans = false;
                                break;
                        }
                        break;
                    case XMLStreamConstants.CHARACTERS:
                        if (srcData != null) {
                            String srcTrns = xmlStreamReader.getText();
                            if (srcTrns != null) {
                                if (isSource) {
                                    // Set source text
                                    isSource = false;
                                } else if (isTrans) {
                                    // Set target text
                                    isTrans = false;
                                }
                            }
                        }
                        break;
                    case XMLStreamConstants.END_ELEMENT:
                        if (xmlStreamReader.getLocalName().equals("group")) {
                            // Add to return list
                        }
                        break;
                }
                if (!xmlStreamReader.hasNext()) {
                    break;
                }
                event = xmlStreamReader.next();
            }
        } catch (XMLStreamException ex) {
            LOG.log(Level.WARNING, ex.getMessage(), MessageFormat.format("{0} {1}", ex.getCause(), ex.getLocation()));
        }
    

    我不确定我到底做错了什么,或者如何收集节点的完整文本。

    任何建议或提示对于继续学习StAX都会有很大帮助。 : - )

1 个答案:

答案 0 :(得分:8)

经过努力和研究后,我已经解决了这个问题。

使用转义实体引用读取文本时出现问题。你需要设置 XMLInputFactory IS_COALESCINGtrue

XMLInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);

基本上这会告诉解析器用它们各自的替换文本替换内部实体引用(换句话说,就像解码一样)并将它们作为普通字符读取。