2014-12-19 19 views
0

我有一個XML字符串:在Android上使用SimpleXML爲XML字符串轉換爲對象給出ParseError(AttributePrefixUnbound)

<Transactions> 
    <TaskFormInstance TransactionID="8230"> 
    <uuid>df534b09-30fc-fe81-e411-a2862ef53439</uuid> 
    <taskId>272</taskId> 
    <status>3-COLLECTED</status> 
    <element> 
     <uuid>a99afff5-0927-21b7-e411-a286183d17bb</uuid> 
     <elementNo>1</elementNo> 
     <label>label1</label> 
     <type>Integer</type> 
     <dependsOn>0</dependsOn> 
     <minimumValue>0</minimumValue> 
     <maximumValue>100</maximumValue> 
     <minimumCharacters xsi:nil="true"/> 
     <maximumCharacters xsi:nil="true"/> 
    </element> 
    <element> 
     <uuid>a99afff5-0927-21b7-e411-a2864e4515bb</uuid> 
     <elementNo>2</elementNo> 
     <label>label2</label> 
     <type>Integer</type> 
     <dependsOn>0</dependsOn> 
     <minimumValue>0</minimumValue> 
     <maximumValue>50</maximumValue> 
     <minimumCharacters xsi:nil="true"/> 
     <maximumCharacters xsi:nil="true"/> 
    </element> 
    </TaskFormInstance> 
</Transactions> 

我使用SimpleXML將其轉換爲一個Java對象。

Serializer serializer = new Persister(); 
Reader reader = new StringReader(xml); 
TaskFormTransactionListTransportBean taskFormTransactionListTransportBean = serializer.read(TaskFormTransactionListTransportBean.class, reader, false); 

這裏是我的豆子其轉換爲:

@Root(name="Transactions") 
    public class TaskFormTransactionListTransportBean { 

    @ElementList(inline = true, required = false) 
    private ArrayList<TaskFormTransportBean> taskFormTransportBeans; 

    public TaskFormTransactionListTransportBean() { 
     taskFormTransportBeans = new ArrayList<TaskFormTransportBean>(); 
    } 

    public ArrayList<TaskFormTransportBean> getTaskFormTransportBeans() { 
     return taskFormTransportBeans; 
    } 

    public void setTaskTransactions(ArrayList<TaskFormTransportBean> taskFormTransportBeans) { 
     this.taskFormTransportBeans = taskFormTransportBeans; 
    } 

}

和:

@Root(name="TaskFormInstance") 
public class TaskFormTransportBean { 

    @Attribute(name="TransactionID") 
    private String transactionId; 

    @Element(name="uuid",required=true) 
    private String uuid; 

    @Element(name="status",required=false) 
    private String status; 

    @Element(name="name",required=false) 
    private String name; 

    @Element(name="taskFormNumber",required=false) 
    private String taskFormNumber; 

    @ElementList(inline = true, required = false) 
    private ArrayList<ElementTransportBean> elements; 

    public String getTransactionId() { 
     return transactionId; 
    } 

    public void setTransactionId(String transactionId) { 
     this.transactionId = transactionId; 
    } 

    public String getUuid() { 
     return uuid; 
    } 

    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getTaskFormNumber() { 
     return taskFormNumber; 
    } 

    public void setTaskFormNumber(String taskFormNumber) { 
     this.taskFormNumber = taskFormNumber; 
    } 

    public ArrayList<ElementTransportBean> getElements() { 
     return elements; 
    } 

    public void setElements(ArrayList<ElementTransportBean> elements) { 
     this.elements = elements; 
    } 

} 

和:

@Root(name="element") 
public class ElementTransportBean { 

    @Element(name="uuid",required=true) 
    private String uuid; 

    @Element(name="value",required=false) 
    private String value; 

    @Element(name="elementNo",required=true) 
    private String elementNo; 

    @Element(name="dependsOn",required=false) 
    private String dependsOn; 

    @Element(name="label",required=true) 
    private String label; 

    @Element(name="type",required=true) 
    private String type; 

    @Element(name="minimumValue",required=false) 
    private String minValue; 

    @Element(name="maximumValue",required=false) 
    private String maxValue; 

    @Element(name="minimumCharacters",required=false) 
    private String minNoOfChars; 

    @Element(name="maximumCharacters",required=false) 
    private String maxNoOfChars; 

    public String getUuid() { 
     return uuid; 
    } 

    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    public String getElementNo() { 
     return elementNo; 
    } 

    public void setElementNo(String elementNo) { 
     this.elementNo = elementNo; 
    } 

    public String getDependsOn() { 
     return dependsOn; 
    } 

    public void setDependsOn(String dependsOn) { 
     this.dependsOn = dependsOn; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public String getMinValue() { 
     return minValue; 
    } 

    public void setMinValue(String minValue) { 
     this.minValue = minValue; 
    } 

    public String getMaxValue() { 
     return maxValue; 
    } 

    public void setMaxValue(String maxValue) { 
     this.maxValue = maxValue; 
    } 

    public String getMinNoOfChars() { 
     return minNoOfChars; 
    } 

    public void setMinNoOfChars(String minNoOfChars) { 
     this.minNoOfChars = minNoOfChars; 
    } 

    public String getMaxNoOfChars() { 
     return maxNoOfChars; 
    } 

    public void setMaxNoOfChars(String maxNoOfChars) { 
     this.maxNoOfChars = maxNoOfChars; 
    } 

} 

我得到以下異常:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[15,42] 
Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?minimumCharacters&xsi:nil&xsi 
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598) 
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:83) 
    at org.simpleframework.xml.stream.StreamReader.read(StreamReader.java:110) 
    at org.simpleframework.xml.stream.StreamReader.next(StreamReader.java:94) 
    at org.simpleframework.xml.stream.NodeReader.readElement(NodeReader.java:121) 
    at org.simpleframework.xml.stream.InputElement.getNext(InputElement.java:216) 
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:447) 
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:190) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:167) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:124) 
    at org.simpleframework.xml.core.Composite.readVariable(Composite.java:623) 
    at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
    at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 
    at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:190) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:167) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:144) 
    at org.simpleframework.xml.core.Composite.readVariable(Composite.java:619) 
    at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
    at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 
    at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:625) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:606) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:584) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:562) 
    at za.co.company.androidsoap.poc.AndroidSoapTest.getTaskFormInserts(AndroidSoapTest.java:323) 
    at za.co.company.androidsoap.poc.AndroidSoapTest.main(AndroidSoapTest.java:76) 
za.co.company.androidsoap.poc.TransportException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[15,42] 
Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?minimumCharacters&xsi:nil&xsi 
    at za.co.company.androidsoap.poc.AndroidSoapTest.getTaskFormInserts(AndroidSoapTest.java:333) 
    at za.co.company.androidsoap.poc.AndroidSoapTest.main(AndroidSoapTest.java:76) 
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[15,42] 
Message: http://www.w3.org/TR/1999/REC-xml-names-19990114#AttributePrefixUnbound?minimumCharacters&xsi:nil&xsi 
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598) 
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:83) 
    at org.simpleframework.xml.stream.StreamReader.read(StreamReader.java:110) 
    at org.simpleframework.xml.stream.StreamReader.next(StreamReader.java:94) 
    at org.simpleframework.xml.stream.NodeReader.readElement(NodeReader.java:121) 
    at org.simpleframework.xml.stream.InputElement.getNext(InputElement.java:216) 
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:447) 
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:190) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:167) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:124) 
    at org.simpleframework.xml.core.Composite.readVariable(Composite.java:623) 
    at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
    at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 
    at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:190) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:167) 
    at org.simpleframework.xml.core.CompositeInlineList.read(CompositeInlineList.java:144) 
    at org.simpleframework.xml.core.Composite.readVariable(Composite.java:619) 
    at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
    at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 
    at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
    at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
    at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:625) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:606) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:584) 
    at org.simpleframework.xml.core.Persister.read(Persister.java:562) 
    at za.co.company.androidsoap.poc.AndroidSoapTest.getTaskFormInserts(AndroidSoapTest.java:323) 
    ... 1 more 

如果我刪除從XML字符串以下行,它工作正常:

<minimumCharacters xsi:nil="true"/> 
<maximumCharacters xsi:nil="true"/> 

我怎麼SimpleXML來解析XML正確,如果我留下那些包含「xsi:nil」屬性的行?

回答

0

我想通了。所提供的XML並不是真的正確。

我添加的名稱空間,第一個元素:

<Transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
... 
</Transactions> 

的SimpleXML現在分析它沒有例外。

我只會問正在生成的XML是否正確完成。