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

Ind*_*igo 4 java xml stax

在使用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()));
    }
Run Code Online (Sandbox Code Playgroud)

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

任何建议或提示对于继续学习StAX更有帮助.:-)

Ind*_*igo 8

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

阅读带有转义实体引用的文本是一个问题.你需要设置 XMLInputFactory IS_COALESCINGtrue

XMLInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
Run Code Online (Sandbox Code Playgroud)

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