java - 无法使用 Stax 中的 XMLEventReader 检查 XML 中的 CDATA

标签 java xml stax

我无法检查 XML 中的 CDATA 并使用 XMLEventReader 读取它。

以下是示例:

 <name>HEADERS</name>
                        <data>
                            <![CDATA[ Sat Nov 19 18:50:15 2016 (1672822) 
]]>
                            <![CDATA[Sat, 19 Nov 2016 18:50:14 -0800 (PST)       
]]>
                        </data>

我使用的Stax api的XMLEventReader如下:

 while (eventReader.hasNext()) {
        XMLEvent event = eventReader.nextEvent();

        if (event.isCharacters()) {
            System.out.println(event.asCharacters().isCData());
            System.out.println(event.asCharacters().getData());
 }
  }

因此,当我读取字符的数据标签时,我得到的 event.asCharacters().isCData() 为 false。想知道如何在 EventReader 中检查 CDATA 并获取 CDATA。

最佳答案

使用以下模式:

  switch (EventType) {
        case XMLStreamConstants.CHARACTERS:
        case XMLStreamConstants.CDATA:
            System.out.println(r.getText());
            break;
        default:
            break;
        }

完整示例:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;

public void readCDATAFromXMLUsingStax() {
    String yourSampleFile = "/path/toYour/sample/file.xml";
    XMLStreamReader r = null;
    try (InputStream in =
            new BufferedInputStream(new FileInputStream(yourSampleFile));) {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        r = factory.createXMLStreamReader(in);
        while (r.hasNext()) {
            switch (r.getEventType()) {
            case XMLStreamConstants.CHARACTERS:
            case XMLStreamConstants.CDATA:
                System.out.println(r.getText());
                break;
            default:
                break;
            }
            r.next();
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        if (r != null) {
            try {
                r.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}

使用/path/toYour/sample/file.xml

 <data>
    <![CDATA[ Sat Nov 19 18:50:15 2016 (1672822)]]>
    <![CDATA[Sat, 19 Nov 2016 18:50:14 -0800 (PST)]]>
 </data>

给予:

 Sat Nov 19 18:50:15 2016 (1672822)                             
 Sat, 19 Nov 2016 18:50:14 -0800 (PST)       

关于java - 无法使用 Stax 中的 XMLEventReader 检查 XML 中的 CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41365068/

相关文章:

xml - Emacs 匹配标签高亮显示

java - 为什么 javax.xml.stream.XMLEventReader 扩展原始 Iterator 而不是 Iterator<XmlEvent>?

java - 如何使用 Woodstox StAX 2 序列化/反序列化 XML 中的类

java - 如何将算法最大值包装到函数中?

Android:CardView 即将推出操作栏

java - 如何让 java swing 组合框显示数组中的列而不是它正在显示的内容?

xml - 如何在Android中证明TextView的文本

java - 创建以斜杠 ('<test/>' 而不是 '<test></test>' 结尾的 XML 文档)

java - 尝试使用 Spring 和扩展 Hibernate 的 JpaRepository 的自定义 GenericDao 接口(interface)来使用 EhCache

java - 使用 Mockito 模拟 lombok @Getter 字段