具有内联列表中的属性的 SimpleXML 单个深度元素



我想解析以下XML

<entry key="9" type="9">
  <value>
    <amount stake="10">50000000</amount>
    <amount stake="1">5000000</amount>
    <winner>0.0</winner>
    <description>9 Correct Numbers</description>
  </value>
</entry>

我尝试使用以下类来实现这一点:

@Root(name="entry")
public class OddsEntryXMLObject {
    @Attribute(name="key")
    private String iKey;
    @Attribute(name="jackpot", required=false)
    private String iJackpot;
    @Attribute(name="type", required=false)
    private String iType;
    @Element(name="value")
    private OddsValueXMLObject iOddsValueXMLObject;
}
public class OddsAmountXMLObject {
    @Element(name="amount")
    private String iAmount;
    @Attribute(name="stake", required=false)
    private String iStake;
}

但是,我得到以下异常:

java.lang.RuntimeException: org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.Element(data=false, name=amount, required=true, type=void) on field 'iAmount' private java.lang.String OddsAmountXMLObject.iAmount for class OddsAmountXMLObject at line 1

有人知道如何解析这个吗?

提供的代码中没有OddsValueXMLObject类的声明。假设声明是我认为的,错误消息基本上意味着它期望amount元素内有一个amount元素,喜欢这个:

<amount>
    <amount></amount>
</amount>

当然,您拥有的 XML 中没有类似的东西。你可以用这个来解析它:

@Root(name="entry")
public class OddsEntryXMLObject{
    @Attribute(name="key")
    private String key;
    @Attribute(name="jackpot", required=false)
    private String jackpot;
    @Attribute(name="type", required=false)
    private String type;
    @Element(name="value")
    private OddsValueXMLObject value;
}
@Root(name="value")
public class OddsValueXMLObject{
    @ElementList(inline=true)
    private java.util.List<OddsAmountXMLObject> amounts;
    @Element(name="winner", required=false)
    private String winner;
    @Element(name="description", required=false)
    private String description;
}
@Root(name="amount")
public class OddsAmountXMLObject{
    @Attribute(name="stake", required=false)
    private String stake; 
    @Text
    private String text;
}

请找到以下工作代码

<?xml version="1.0" encoding="UTF-8"?>
<entry key="9" type="9">
  <value>
   <amount stake="10">50000000</amount>  
     <!-  <amount stake="1">5000000</amount>     -->   
    <!-- <winner>0.0</winner>-->
    <!--<description>9 Correct Numbers</description> -->
  </value>
</entry>

1(我已经评论了数量,因为它的属性相同,所以抛出错误,你需要修复你的样本xml。

2(您的班级中缺少获胜者和描述。

3(你需要再定义一个类来获取值。

4( 您的根元素丢失**

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
  @Root(name="amount")
class OddsAmountXMLObject {
        @Element(name="amount")
        private String iAmount;
        @Attribute(name="stake", required=false)
        private String iStake;

}

其他类

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
@Root(name="entry")
public class OddsEntryXMLObject {
   @Attribute(name="key") String iKey;
   @Attribute(name="jackpot", required=false)
   private String iJackpot;
   @Attribute(name="type", required=false)
   private String iType;
   @Element(name="value")
   private OddsAmountXMLObject iOddsValueXMLObject;
}

测试示例

import java.io.File;
import org.simpleframework.xml.core.Persister;
public class ParseExample {

    public static void main(String[] list) throws Exception {
        Persister persister = new Persister();
         File file = new File("C:\Users\290008812\Jhipster_workspace\Test\src\DOMParserDemo\NewFile.xml");//My xml path
         OddsEntryXMLObject example = persister.read(OddsEntryXMLObject.class, file);
        //System.out.println(example.iKey);
        //System.out.println(example.amount2);
        persister.write(example, System.out);
    }


}

我正在使用"simple-xml-2.6.jar">

结果:

由于您在xml中声明了两次金额,因此收到错误" 元素'amount'在第6行声明了两次",因此需要修复您的xml结构

Exception in thread "main" org.simpleframework.xml.core.PersistenceException: Element 'amount' declared twice at line 6
    at org.simpleframework.xml.core.Variable$Adapter.read(Variable.java:444)
    at org.simpleframework.xml.core.Variable$Adapter.read(Variable.java:422)
    at org.simpleframework.xml.core.Composite.readVariable(Composite.java:679)
    at org.simpleframework.xml.core.Composite.readInstance(Composite.java:627)

有几个amount元素,因此表示有一个列表。此解决方案使用 javax.xml 类而不是第三方 SimpleXml 库。entry类:

@XmlRootElement(name="entry")
public class OddsEntryXMLObject {
    @XmlAttribute(name="key")
    private String iKey;
    @XmlAttribute(name="jackpot", required=false)
    private String iJackpot;
    @XmlAttribute(name="type", required=false)
    private String iType;
    @XmlElement(name="value")
    private OddsValueXMLObject value;
}

这包含一个值类,但如果需要,可以将其更改为List

@XmlRootElement(name="value")
public class OddsValueXMLObject {
    @XmlElement(name="amount")
    List<OddsAmountXMLObject> amounts;
    @XmlElement(name="winner")
    private String dWinner;
    @XmlElement(name="description")
    private String sDescription;
}

这有一个amount类,金额List

@XmlRootElement(name="amount")
public class OddsAmountXMLObject {
    @XmlValue
    private String iAmount;
    @XmlAttribute(name="stake")
    private String iStake;
}

您可以使用以下代码对其进行测试:

JAXBContext jc = JAXBContext.newInstance( OddsEntryXMLObject.class, OddsValueXMLObject.class, OddsAmountXMLObject.class  );
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<OddsEntryXMLObject> o = u.unmarshal( new StreamSource(getClass().getResourceAsStream("SimpleXML.xml")), OddsEntryXMLObject.class);

Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(o, System.out);

输出与输入相同的 xml。这些类还将使用 schemagen 进行往返,以创建.xsd文件,并xjc.xsd模式编译回 Java POJO。往返后,此字段名称将更改,因为注释与原始名称不匹配,因此建议您更改字段(属性(名称以匹配注释。

最新更新