xml-parsing – 使用JAXB部分解组XML以跳过某些xmlElement

前端之家收集整理的这篇文章主要介绍了xml-parsing – 使用JAXB部分解组XML以跳过某些xmlElement前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用JAXB将XML文件解组为java对象. XML文件非常大,包含一些我想在某些情况下跳过的节点,以提高性能,因为客户端java程序无法编辑这些元素.

示例XML如下:

  1. <Example id="10" date="1970-01-01" version="1.0">
  2. <Properties>...</Properties>
  3. <Summary>...</Summary>
  4. <RawData>
  5. <Document id="1">...</Document>
  6. <Document id="2">...</Document>
  7. <Document id="3">...</Document>
  8. ------
  9. ------
  10. </RawData>
  11. <Location></Location>
  12. <Title></Title>
  13. ----- // more elements
  14. </Example>

我有两个用例:

> unmarshal into Example对象,其中包含Properties,Summaries,RawData等,而不跳过任何RawData. (已完成此部分)
> unmarshal into Example对象,不包括RawData.嵌套在RawData中的元素非常大,因此不希望在此用例中阅读此内容.

现在我想解组XML,以便可以跳过RawData.我尝试过this link提供的技术.

使用上面链接中提供的技术也会跳过RawData之后的所有元素.

我已使用以下代码修复了XMLEventReader的问题:
  1. public class PartialXmlEventReader implements XMLEventReader {
  2.  
  3. private final XMLEventReader reader;
  4. private final QName qName;
  5. private boolean skip = false;
  6.  
  7. public PartialXmlEventReader(final XMLEventReader reader,final QName element) {
  8. this.reader = reader;
  9. this.qName = element;
  10. }
  11.  
  12. @Override
  13. public String getElementText() throws XMLStreamException {
  14. return reader.getElementText();
  15. }
  16.  
  17. @Override
  18. public Object getProperty(final String name) throws IllegalArgumentException {
  19. return reader.getProperty(name);
  20. }
  21.  
  22. @Override
  23. public boolean hasNext() {
  24. return reader.hasNext();
  25. }
  26.  
  27. @Override
  28. public XMLEvent nextEvent() throws XMLStreamException {
  29. while (iSEOf(reader.peek())) {
  30. reader.nextEvent();
  31. }
  32.  
  33. return reader.nextEvent();
  34. }
  35.  
  36. @Override
  37. public XMLEvent nextTag() throws XMLStreamException {
  38. return reader.nextTag();
  39. }
  40.  
  41. @Override
  42. public XMLEvent peek() throws XMLStreamException {
  43. return reader.peek();
  44. }
  45.  
  46. @Override
  47. public Object next() {
  48. return reader.next();
  49. }
  50.  
  51. @Override
  52. public void remove() {
  53. reader.remove();
  54. }
  55.  
  56. @Override
  57. public void close() throws XMLStreamException {
  58. reader.close();
  59. }
  60.  
  61. private boolean iSEOf(final XMLEvent e) {
  62. boolean returnValue = skip;
  63. switch (e.getEventType()) {
  64. case XMLStreamConstants.START_ELEMENT:
  65. final StartElement se = (StartElement) e;
  66. if (se.getName().equals(qName)) {
  67. skip = true;
  68. returnValue = true;
  69. }
  70. break;
  71. case XMLStreamConstants.END_ELEMENT:
  72. final EndElement ee = (EndElement) e;
  73. if (ee.getName().equals(qName)) {
  74. skip = false;
  75. }
  76. break;
  77. }
  78. return returnValue;
  79. }

}

虽然Unmarshalling只是将这个eventReader传递给unmarshal方法

  1. final JAXBContext context = JAXBContext.newInstance(classes);
  2. final Unmarshaller um = context.createUnmarshaller();
  3. Reader reader = null;
  4. try {
  5. reader = new BufferedReader(new FileReader(xmlFile));
  6. final QName qName = new QName("RawData");
  7. final XMLInputFactory xif = XMLInputFactory.newInstance();
  8. final XMLEventReader xmlEventReader = xif.createXMLEventReader(reader);
  9. final Example example =
  10. (Example) um.unmarshal(new PartialXmlEventReader(xmlEventReader,qName));
  11. }
  12. } finally {
  13. IoUtils.closeQuietly(reader);
  14. }

猜你在找的XML相关文章