gpt4 book ai didi

java - woodstox 跳过部分 xml

转载 作者:数据小太阳 更新时间:2023-10-29 02:22:16 25 4
gpt4 key购买 nike

Java: 1.6
伍德斯托克斯:4.1.4

我只想在解析时跳过部分 xml 文件。让我们看看这个简单的 xml:

<family>
<mom>
<data height="160"/>
</mom>
<dad>
<data height="175"/>
</dad>
</family>

我只想跳过爸爸元素。所以看起来使用如下所示的 skipElement 方法是个好主意:

FileInputStream fis = ...;
XMLStreamReader2 xmlsr = (XMLStreamReader2) xmlif.createXMLStreamReader(fis);

String currentElementName = null;
while(xmlsr.hasNext()){

int eventType = xmlsr.next();

switch(eventType){

case (XMLEvent2.START_ELEMENT):
currentElementName = xmlsr.getName().toString();

if("dad".equals(currentElementName) == true){
logger.info("isStartElement: " + xmlsr.isStartElement());
logger.info("Element BEGIN: " + currentElementName);
xmlsr.skipElement();
}

...
}
}

我们只是找到元素 dad 的开始,然后跳过它。但不会那么快,因为会抛出 Exception。这是输出:

isStartElement: true
Element BEGIN: dad
Exception in thread "main" java.lang.IllegalStateException: Current state not START_ELEMENT

这不是预期的。这确实是非常出乎意料的,因为方法skipElement是在START_ELEMENT状态下执行的。这是怎么回事?

最佳答案

我在 java 1.6 (jdk1.6.0_30) 中使用 woodstox-core-lgpl-4.1.4.jar、stax2-api-3.1.1.jar 在库路径上进行了尝试。我的java文件是这样的:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;

import org.codehaus.stax2.XMLStreamReader2;
import org.codehaus.stax2.evt.XMLEvent2;

public class Skip {

public static void main(String[] args) throws FileNotFoundException,
XMLStreamException {
System.setProperty("javax.xml.stream.XMLInputFactory",
"com.ctc.wstx.stax.WstxInputFactory");
System.setProperty("javax.xml.stream.XMLOutputFactory",
"com.ctc.wstx.stax.WstxOutputFactory");
System.setProperty("javax.xml.stream.XMLEventFactory",
"com.ctc.wstx.stax.WstxEventFactory");

FileInputStream fis = new FileInputStream(new File("family.xml"));
XMLInputFactory xmlif = XMLInputFactory.newFactory();
XMLStreamReader2 xmlsr = (XMLStreamReader2) xmlif
.createXMLStreamReader(fis);

String currentElementName = null;
while (xmlsr.hasNext()) {

int eventType = xmlsr.next();

switch (eventType) {

case (XMLEvent2.START_ELEMENT):
currentElementName = xmlsr.getName().toString();

if ("dad".equals(currentElementName) == true) {
System.out.println("isStartElement: "
+ xmlsr.isStartElement());
System.out.println("Element BEGIN: " + currentElementName);
xmlsr.skipElement();
}
else {
System.out.println(currentElementName);
}

}
}
}
}

像魅力一样工作。输出是

family
mom
data
isStartElement: true
Element BEGIN: dad

关于java - woodstox 跳过部分 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14326598/

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