Java SimpleXML内联列表中具有属性的单个深度元素
我想解析以下XMLJava SimpleXML内联列表中具有属性的单个深度元素,java,xml,simple-framework,Java,Xml,Simple Framework,我想解析以下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</descrip
<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>
但是,我得到以下例外情况:
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
类的声明。
假设声明是我认为的那样,
错误消息基本上意味着它在金额
元素中需要金额
元素,
像这样:
当然,在XML中没有类似的内容。
您可以改为使用以下内容对其进行分析:
@Root(name=“entry”)
公共类OddsEntryXMLObject{
@属性(name=“key”)
私钥;
@属性(name=“jackpot”,必需=false)
私人串头奖;
@属性(name=“type”,required=false)
私有字符串类型;
@元素(name=“value”)
私有OddsValueXMLObject值;
}
@Root(name=“value”)
公共类OddsValueXMLObject{
@ElementList(inline=true)
private java.util.List金额;
@元素(name=“winner”,必需=false)
私人弦乐冠军;
@元素(name=“description”,required=false)
私有字符串描述;
}
@Root(name=“amount”)
公共类OddsAmountXMLObject{
@属性(name=“stack”,必需=false)
私人串股;
@正文
私有字符串文本;
}
请查找以下工作代码
<?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>
其他类
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行中声明了两次错误“Element'amount”,所以需要修复您的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库。条目
类:
@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;
}
这包含一个值类,但如果需要,可以将其更改为列表
:
@XmlRootElement(name="value")
public class OddsValueXMLObject {
@XmlElement(name="amount")
List<OddsAmountXMLObject> amounts;
@XmlElement(name="winner")
private String dWinner;
@XmlElement(name="description")
private String sDescription;
}
您可以使用以下代码对其进行测试:
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);
JAXBContext jc=JAXBContext.newInstance(OddsEntryXMLObject.class、OddsValueXMLObject.class、OddsAmountXMLObject.class);
解组器u=jc.createUnmarshaller();
JAXBElement o=u.unmarshal(新的StreamSource(getClass().getResourceAsStream(“SimpleXML.xml”)),OddsEntryXMLObject.class);
Marshaller m=jc.createMarshaller();
m、 setProperty(Marshaller.JAXB_格式的_输出,Boolean.TRUE);
m、 元帅(o,系统输出);
它输出与输入相同的xml。这些类还将使用
schemagen
进行往返,以创建.xsd
文件和xjc
将.xsd
模式编译回Java POJO。往返之后,由于注释与原始名称不匹配,此字段名称将更改,因此建议您更改字段(属性)名称以匹配注释。我将simplexml
标记替换为java
、xml
和simple framework
。SimpleXML是PHP中的一个扩展,它会吸引PHP程序员来回答您的问题。这可能就是为什么它几个月来没有受到太多关注的原因。有太多的问题,所以您希望正确地获取标记。这不是问题的答案。u.unmarshal(newstreamsource(getClass().getResourceAsStream(“SimpleXML.xml”)、OddsEntryXMLObject.class)代码>调用解析XML。问题是什么?他问的是为什么会出现异常,而不是如何解析XML。
@XmlRootElement(name="value")
public class OddsValueXMLObject {
@XmlElement(name="amount")
List<OddsAmountXMLObject> amounts;
@XmlElement(name="winner")
private String dWinner;
@XmlElement(name="description")
private String sDescription;
}
@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);