【问题标题】:StAX not returning all characters in a stringStAX 不返回字符串中的所有字符
【发布时间】:2017-02-21 04:37:32
【问题描述】:

我一直在尝试使用 StAX 创建一个 XML 控制器类。 我的问题是我没有得到一个元素的完整字符串,而是得到了字符串的一小部分。 (请注意,出于安全原因,部分内容已被隐藏,这些内容将显示为{content}

Characters characters = event.asCharacters();
if (!characters.isWhiteSpace()) {
    System.out.println(characters.getData());
}

上面的代码没有返回完整的字符串。

我希望收到的是:
{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+

我得到的是上面的 5 个单独部分的字符串:
{responseType} \([0-9]+\) ACC: [0-9]
+,[0-9]+,[0-9]
+,[0-9]+,[0-9]
+,[0-9]+,[0-9]
+,[0-9]+

我的代码:

public static ArrayList<SmsCommand> readXML() {
    if (init()) {
        try {
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                switch (event.getEventType()) {
                case XMLStreamConstants.START_ELEMENT:
                    StartElement startElement = event.asStartElement();
                    String qName = startElement.getName().getLocalPart();
                    if (qName.equalsIgnoreCase("command")) {
                        Iterator<Attribute> attributes = startElement.getAttributes();
                        command = new SmsCommand(attributes.next().getValue());
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                    Characters characters = event.asCharacters();
                    if (!characters.isWhiteSpace()) {
                        command.addResponse(characters.getData());
                    }
                    break;
                case XMLStreamConstants.END_ELEMENT:
                    EndElement endElement = event.asEndElement();
                    if (endElement.getName().getLocalPart().equalsIgnoreCase("command")) {
                        commands.add(command);
                    }
                    break;
                }
            }
        }
        catch (XMLStreamException e) {
            e.printStackTrace();
        }
    }
    return commands;
}

还有我的xml:

<?xml version="1.0" ?>
<root>
  <command type="{command}">
    <response>{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+</response>
  </command>
</root>

【问题讨论】:

标签: java xml stax


【解决方案1】:

当您知道您有一个纯文本 XMLStreamConstants.START_ELEMENT 时,您可以致电 http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLEventReader.html#getElementText()

【讨论】:

  • 非常好的方法,感谢您指出这一点。虽然这不是这种情况下的正确解决方案,但我一定会在未来牢记这一点。
  • @Martin 我们如何知道它是纯文本元素?假设我们不知道运行时 xml 的确切结构
【解决方案2】:

StAX 解析器只是按照相同的顺序将字符分成更小的部分。您可以使用StringBuilder 重建它,同时添加一些长度检查以确保安全。或者你可以设置一个标志来默认组合它。

默认情况下,StAX 解析器会破坏(通常很大)CHARACTER 事件 成碎片以避免产生大的字符串。你无法控制 发生这种中断的位置。

您可以使用工厂属性“javax.xml.stream.isCoalescing”来 控制这种行为并强制它结合相邻的 CHARACTER 事件合并为一个事件。

参考:

【讨论】:

  • 添加“javax.xml.stream.isCoalescing”成功了,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多