While 循环在解组时不循环遍历整个 xml 字符串

问题描述 投票:0回答:1

我有一个 xml 字符串,我对其进行了解组,但它只返回第一部分。我相信我的 while 循环不正确。

while(xsr.hasNext()){   
     if(xsr.isStartElement() && "list".equals(xsr.getLocalName())) {           
          break;        
     }       
     xsr.next(); 
}

我的 Xml 字符串与此类似 -

<list><name>Ben_1</name><assign>trac</assign></list><list><name>John</name><assign>task</assign></list>

当我从邮递员那里发出 get 请求时,它只返回

{
  "list": {
    "name": "Ben_1",
    "assign": "trac"
  }
}

我尝试了这些(和其他)帖子中的方法 - JAXB 使用命名空间和前缀进行解组

我期望的答案应该是

{
  "list": [
    {
      "name": "Ben_1",
      "assign": "trac"
    },
    {
      "name": "John",
      "assign": "task"
    }
  ]
}
java soap jaxb
1个回答
0
投票

在此 XML 中没有一个顶级元素。有两个

list
元素:

<list>
    <name>Ben_1</name>
    <assign>trac</name>
</list>
<list>
    <name>John</name>
    <assign>task</name>
</list>

在此 XML 中,有一个顶级元素

lists
:

<lists>
    <list>
        <name>Ben_1</name>
        <assign>trac</name>
    </list>
    <list>
        <name>John</name>
        <assign>task</name>
    </list>
</lists>

如果您将其绘制为树结构,它将是一棵树,而对于前面的示例,每个

list
将有一棵树:一个“森林”。
XMLStreamReader
需要一棵树,而不是一片森林。

import java.io.StringReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource;

String xml = "<lists><list><name>Ben_1</name><assign>trac</assign></list>" +
    "<list><name>John</name><assign>task</assign></list></lists>";

var xif = XMLInputFactory.newInstance();
var xsr = xif.createXMLStreamReader(new StreamSource(new StringReader(xml)));

while (xsr.hasNext()) {
    if (xsr.hasText()) {
        System.out.println(xsr.getText());
    }
    xsr.next();
}

考虑到“森林”XML,此代码将抛出一个

XMLStreamException
,其中包含消息“根元素后面的文档中的标记必须格式正确”。当它到达第二个
<list>
标签时,但给定“树”XML,它将输出:

Ben_1
trac
John
task

我不知道你打算如何处理这些数据,但这应该可以让你超越当前所困的点。

© www.soinside.com 2019 - 2024. All rights reserved.