Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleXML内联列表中具有属性的单个深度元素_Java_Xml_Simple Framework - Fatal编程技术网

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

Java 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

我想解析以下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>
但是,我得到以下例外情况:

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);