簡體   English   中英

內聯列表中具有屬性的SimpleXML單個深度元素

[英]SimpleXML Single Depth Element with Attribute in Inline List

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

有幾個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進行往返schemagen以創建.xsd文件,並使用xjc.xsd模式編譯回Java POJO。 在往返之后,此字段名稱將更改,因為注釋與原始名稱不匹配,因此建議您更改字段(屬性)名稱以匹配注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM