2017-02-08 1 views
2

Я хочу проанализировать следующие XMLSimpleXML Single Глубина элемента с атрибутом в Inline Список

<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 

Кто-нибудь знает, как разобрать это?

+2

Я заменил тег 'simplexml'' java', 'xml' и' simple-framework'. SimpleXML - это расширение в PHP, которое привлечет PHP-кодеров к вашему вопросу. Вероятно, поэтому он не получал много внимания в течение нескольких месяцев. Есть так много вопросов о том, как вы хотите, чтобы ваши теги были правильными. – Rei

ответ

3

Нет объявления для 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; 
} 
0

Вы можете найти следующий рабочий код

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




} 

Я использую "простой XML-2.6.jar"

Результаты:

Поскольку вы объявили сумму, два времени в получении ошибки XML «Element„количество“объявлен дважды в строке 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) 
0

Есть несколько 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. После этого перехода имена полей будут изменены, поскольку аннотации не соответствуют оригинальным именам, поэтому рекомендуется изменить имена полей (свойств) в соответствии с аннотациями.

+0

Это не ответ на вопрос. – toolforger

+0

«u.unmarshal (новый StreamSource (getClass(). GetResourceAsStream (« SimpleXML.xml »)), OddsEntryXMLObject.class);' call анализирует XML. В чем проблема? –

+1

Он спрашивал, почему он получает исключение, а не как разбирать XML. – toolforger