使用XMLStreamReader读取转义字符

Rom*_*man 6 java xml

嗨,我在使用XMLStreamReader读取xml中的转义字符时遇到问题.

例如,我有这个元素:

<a>foo&amp;bar</a>
Run Code Online (Sandbox Code Playgroud)

当我读取值时,&amp;截断后的所有内容,我得到的值是"foo"

任何想法如何解决?

yon*_*ran 17

要强制XMLStreamReader返回单个字符串,您必须javax.xml.stream.isCoalescing 按照XMLStreamReader#next()文档的指示设置属性:

XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty("javax.xml.stream.isCoalescing", true);  // decode entities into one string
XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(stringReader);
Run Code Online (Sandbox Code Playgroud)

  • 您可以将常数用于[XMLInputFactory](https://docs.oracle.com/javase/8/docs/api/javax/xml/stream/XMLInputFactory.html#IS_COALESCING)中定义的属性。 (2认同)

mdm*_*dma 5

我不确定是什么问题-我的测试会产生您期望的结果。

跑步

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(
     new StringReader("<tag>foo&amp;bar</tag>"));
PrintWriter pw = new PrintWriter(System.out, true);
while (reader.hasNext())
{
    reader.next();
    pw.print(reader.getEventType());
    if (reader.hasText())
        pw.append(' ').append(reader.getText());
    pw.println();
}
Run Code Online (Sandbox Code Playgroud)

产生

1
4 foo
4 &
4 bar
2
8
Run Code Online (Sandbox Code Playgroud)

在JDK 1.6.0.11上-我知道比较旧。如果结果不同,我将升级并发回。

要记住的一件事是,XMLStreamReadercan(并且确实!)将字符数据分成几个块,如您在上面看到的-重复的4个事件(4 = CHARACTERS)表示元素的文本作为3个事件发送。