我想解析以下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。往返后,此字段名称将更改,因为注释与原始名称不匹配,因此建议您更改字段(属性(名称以匹配注释。