【问题标题】:Unable to check CDATA in XML using XMLEventReader in Stax无法使用 Stax 中的 XMLEventReader 检查 XML 中的 CDATA
【发布时间】:2017-05-12 21:57:35
【问题描述】:

我无法检查 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。

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

    设置属性,否则读取器会忽略CDATA的事件类型。

    XMLInputFactory factory = XMLInputFactory.newInstance();
    factory.setProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.STAX_REPORT_CDATA_EVENT,Boolean.TRUE);
    

    参见 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl,行:3027

    【讨论】:

      【解决方案2】:

      使用以下模式:

        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)       
      

      【讨论】:

        猜你喜欢
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 2021-08-13
        • 1970-01-01
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多