- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚尝试利用 StAX 来解析一些简单的 XML 文档
<?xml version="1.0"?>
<root>
<Employee>
<name>John</name>
</Employee>
<Employee>
<name>Lisa</name>
</Employee>
</root>
...但是遇到了一个让我抓狂的问题。这是代码:
public class Foo {
public String name;
@Override
public String toString() {
return "Foo{" + "name='" + name + '\'' + '}';
}
}
public class StAXParserTest {
@Test
public void testFoo() throws Exception {
List<Foo> result = new ArrayList<>();
XMLEventReader eventReader = XMLInputFactory
.newInstance()
.createXMLEventReader(getResourceAsStream("example.xml"));
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElem = event.asStartElement();
switch (startElem.getName().getLocalPart()) {
case "Employee":
result.add(parseFoo(eventReader));
break;
}
}
}
System.out.println(result);
}
private static Foo parseFoo(XMLEventReader eventReader) throws XMLStreamException {
Foo foo = new Foo();
while (true) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
switch (event.asStartElement().getName().getLocalPart()) {
case "name":
foo.name = eventReader.nextEvent().asCharacters().getData();
break;
}
}
if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals("Foo")) {
return foo;
}
}
}
private InputStream getResourceAsStream(String filename) throws URISyntaxException {
return this.getClass().getClassLoader().getResourceAsStream(filename);
}
}
没有什么错吧。但如果您运行测试,您将收到以下错误。
java.util.NoSuchElementException
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:88)
at stax.StAXParserTest.parseFoo(StAXParserTest.java:40)
at stax.StAXParserTest.testFoo(StAXParserTest.java:29)
我花了一个小时才找出原因。为了解决这个问题,POJO 类名必须与 XML 标签名完全相同(即 Foo.class 应重命名为 Employee.class),然后才能正常工作:
[Employee{name='John'}, Employee{name='Lisa'}]
所以我的问题是W-H-Y-YYYYYY?这绝对是不直观的。这不是 JAXB。不是任何其他对象映射器。如果我自己完成所有工作,那么为什么类名很重要?
附注最初是 Employee.class
和<employee/>
问题,但我简化了测试用例以强调类名。
最佳答案
您必须将员工检查为结束节点,而不是“foo”
。
if (event.isEndElement() && event.asEndElement()
.getName().getLocalPart()
.equals("Employee")) {
return foo;
}
关于java - StAX - XMLEventReader 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43212304/
我知道使用sax时可以验证xml文件。但是我可以在使用Stax时进行验证吗? 最佳答案 SAX和DOM有两种XML验证方式: 单独验证-通过Validator.validate() 在解析期间验证-通
我在类路径中有一个 woodstox 和 java SE 1.6 stax 解析器,但默认情况下似乎选择了 woodstox。 但是在某些情况下,我想使用默认的 Java stax 解析器。有没有办法
我正面临 Woodstox STAX 和 java 1.6 STAX 实现之间奇怪的运行时冲突。由于我使用的是 CXF,它会将 Woodstox jar 作为其依赖项的一部分。这是我正在使用的示例代码
我正在尝试将一些代码从使用 DOM(通过 jDOM)转换为使用 StAX。同时,我正在从基于 DTD 的验证迁移到基于 XSD 的验证。哦,为了更好的衡量,我将 JAXB 引入等式 :) 无论如何,作
我不知道如何提取 XML 文件中的开始标记元素名称。我很接近〜意味着没有错误,我正在获取标签名称,但我正在获取标签名称加上信息。我得到的是: {http://www.publishing.org}au
对于下面发布的 xml 文件,我正在使用 StAX 来处理它。我写了下面的代码,但我不知道为什么尽管 xml 文件中有属性,但没有打印有关属性的信息。我希望控制台显示有关“id”、“lat”和“lon
我正在使用 StAX 来处理巨大的 xml 文件。如下面的代码所示,在 switch-case 中有一个默认条件。当我运行代码时默认情况下的文本打印以下内容: unhandled case4 case
我正在尝试使用 stax 从下面的 xml 中获取父项,请注意,同一结构中可以有多个父项和子项。 PARENT-CODE-1 PARENT-NAME-1
我有一个 xml <RPTSVC role:instanceID="765002" role:roleName="Re
是否有可能/是否有一种简单的方法可以找到与 START_ELEMENT 相对应的结束标记 (END_ELEMENT),如下所示? while(reader.hasNext()){ XM
我有以下(测试)XML 文件和使用 StaX 的 Java 代码。我想将此代码应用于大约 30 GB 大但元素相当小的文件,所以我认为 StaX 是一个不错的选择。我收到以下错误: 线程“main”中
我正在使用 java stax XMLStreamReader 来读取 xml。我想抓取某些内部节点的整个字符串。 XML: 我只想能够
我一直在尝试使用 StAX 创建一个 XML Controller 类。我的问题是我没有得到一个元素的完整字符串,而是得到了字符串的一小部分。 (请注意,出于安全原因,某些内容已被隐藏,这些内容将显示
我使用的是 java 6,rt.jar 具有进行基于 STaX 的解析所需的所有类。我主要使用以下类: import javax.xml.stream.XMLEventReader; import j
我正在使用 STAX 事件 API 读取从 SOAP 调用接收到的二进制数据,并希望将其流式传输给使用者。 SOAP 调用的 XML 有效负载如下所示: ......... PHNvY
我在来自 http://stax.codehaus.org/ 的 vrsion 1.2.0 中使用 StAX Streaming Api .当我尝试将以下 xml 写入文件时,不会转义大于 char
我正在使用以下简单的 StAX 代码循环访问 XML 中的所有标记。尺寸input.xml > 100 MB XMLInputFactory xif = XMLInputFactory.newInst
我正在读取与下面相同的 XML 文件: 我希望下面的代码打印出三个 e在屏幕上: XMLInputFactory factory = XMLInputFact
我有以下代码: XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLStreamReader xmlStreamReade
我知道如何利用 java stax iterator api 来读取 xml 文档,但我想了解 XMLEvent 和 XMLEventReader 的实现。 XMLInputFactory xmlIn
我是一名优秀的程序员,十分优秀!