[英]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.