gpt4 book ai didi

xml-parsing - 使用 JAXB 对 XML 进行部分解码以跳过一些 xmlElement

转载 作者:行者123 更新时间:2023-12-04 02:56:09 32 4
gpt4 key购买 nike

我想使用 JAXB 将 XML 文件解码为 java 对象。 XML 文件非常大,包含一些节点,在某些情况下我想跳过这些节点以提高性能,因为客户端 Java 程序无法编辑这些元素。

示例 XML 如下:

<Example id="10" date="1970-01-01" version="1.0"> 
<Properties>...</Properties>
<Summary>...</Summary>
<RawData>
<Document id="1">...</Document>
<Document id="2">...</Document>
<Document id="3">...</Document>
------
------
</RawData>
<Location></Location>
<Title></Title>
----- // more elements
</Example>

我有两个用例:

  • 在不跳过任何 RawData 的情况下解码为包含 Properties、Summaries、RawData 等的 Example 对象。 (这部分已经完成)
  • 解码为不包括 RawData 的 Example 对象。 RawData 中嵌套的元素非常大,因此在此用例中不想阅读。

现在我想解码 XML,以便可以跳过 RawData。我已经尝试了 this link 提供的技术.

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

最佳答案

我已使用以下代码解决了 XMLEventReader 的问题:

public class PartialXmlEventReader implements XMLEventReader {

private final XMLEventReader reader;
private final QName qName;
private boolean skip = false;

public PartialXmlEventReader(final XMLEventReader reader, final QName element) {
this.reader = reader;
this.qName = element;
}

@Override
public String getElementText() throws XMLStreamException {
return reader.getElementText();
}

@Override
public Object getProperty(final String name) throws IllegalArgumentException {
return reader.getProperty(name);
}

@Override
public boolean hasNext() {
return reader.hasNext();
}

@Override
public XMLEvent nextEvent() throws XMLStreamException {
while (isEof(reader.peek())) {
reader.nextEvent();
}

return reader.nextEvent();
}

@Override
public XMLEvent nextTag() throws XMLStreamException {
return reader.nextTag();
}

@Override
public XMLEvent peek() throws XMLStreamException {
return reader.peek();
}

@Override
public Object next() {
return reader.next();
}

@Override
public void remove() {
reader.remove();
}

@Override
public void close() throws XMLStreamException {
reader.close();
}

private boolean isEof(final XMLEvent e) {
boolean returnValue = skip;
switch (e.getEventType()) {
case XMLStreamConstants.START_ELEMENT:
final StartElement se = (StartElement) e;
if (se.getName().equals(qName)) {
skip = true;
returnValue = true;
}
break;
case XMLStreamConstants.END_ELEMENT:
final EndElement ee = (EndElement) e;
if (ee.getName().equals(qName)) {
skip = false;
}
break;
}
return returnValue;
}

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

final JAXBContext context = JAXBContext.newInstance(classes);
final Unmarshaller um = context.createUnmarshaller();
Reader reader = null;
try {
reader = new BufferedReader(new FileReader(xmlFile));
final QName qName = new QName("RawData");
final XMLInputFactory xif = XMLInputFactory.newInstance();
final XMLEventReader xmlEventReader = xif.createXMLEventReader(reader);
final Example example =
(Example) um.unmarshal(new PartialXmlEventReader(xmlEventReader, qName));
}
} finally {
IOUtils.closeQuietly(reader);
}

关于xml-parsing - 使用 JAXB 对 XML 进行部分解码以跳过一些 xmlElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16656809/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com