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

问题描述 投票:3回答:3

我想解析以下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

谁知道如何解析这个?

java xml simple-framework
3个回答
4
投票

在提供的代码中没有关于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;
}

0
投票

请查找以下工作代码

<?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)你的Root元素缺失**

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中声明了两次获取错误“元素'数量'在第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)

0
投票

有几个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。在往返之后,此字段名称将更改,因为注释与原始名称不匹配,因此建议您更改字段(属性)名称以匹配注释。

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