【问题标题】:Problems getting XML node text in StAX XMLStreamConstants.CHARACTERS event在 StAX XMLStreamConstants.CHARACTERS 事件中获取 XML 节点文本的问题
【发布时间】:2014-05-11 22:56:37
【问题描述】:

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

那么问题来了,

  1. XMLStreamConstants.CHARACTERS 事件中,当我以XMLStreamReader.getText() 方法收集节点文本时。
  2. 如果节点文本中存在 &、 或什至隐藏的内容,则它仅返回文本字符串的第一部分。 例如ABC & XYZ 仅返回 ABC

简体 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 有很大帮助。 :-)

【问题讨论】:

  • 能否请您也提供代码和堆栈跟踪...
  • @Prabhaker Yeap,刚刚添加了我的代码的简化版本,无法加载完整的代码,太多了。谢谢。
  • 抱歉,抱歉,这不是错误,而是从节点收集完整文本的问题。

标签: java xml stax


【解决方案1】:

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

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

XMLInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);

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

【讨论】:

  • 用这一行解决了我的问题。谢谢
猜你喜欢
  • 2012-02-14
  • 2011-05-20
  • 2013-04-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
相关资源
最近更新 更多