2012-08-22 29 views
3

我想un-marshall一個xml,這是很多問題變成惡夢。 所以我有一個想法解開這個XML的一部分到一個對我來說是必需的對象。Unmarshall xml的一部分到一個對象

原始的XML:http://snipurl.com/24qkyi7

現在我從這個XML需要的是:http://snipurl.com/24qkyyl

我有類和兩個XML的其他相關信息。

如果我手動給這個數據http://snipurl.com/24ql04x取消編組,我得到StandardError對象。但是,我可以直接給原始的XML來獲取這個對象。

PS:原始的XML解析使用JAXB

堆棧跟蹤:這我不能解組原始XML類的http://snipurl.com/24qtrnv 類文件。在此 http://snipurl.com/24qttn8

StandardError的類號源控制:http://snipurl.com/24rpdld 主要XML類:http://snipurl.com/24rpdxu

XSD:http://snipurl.com/24rryfi

+0

您可以分享您正在使用的代碼和錯誤中的堆棧跟蹤嗎? –

+0

附加原始堆棧跟蹤 – Reddy

+0

@Reddy您的任何鏈接都不起作用,plz添加xml和xsd的 – LMK

回答

9

我會使用StAX的XMLStreamReader解析器XML,推進XMLStreamReader的元素你希望解組。然後我會讓JAXB解組XMLStreamReader。像下面這樣:

演示

package bgc.objects.rosy.standarderror.v3; 

import javax.xml.bind.*; 
import javax.xml.stream.*; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     StreamSource xml = new StreamSource("src/bgc/objects/rosy/standarderror/v3/input.xml"); 
     XMLStreamReader xsr = xif.createXMLStreamReader(xml); 
     while(xsr.hasNext()) { 
      if(xsr.isStartElement() && xsr.getLocalName().equals("StandardError")) { 
       break; 
      } 
      xsr.next(); 
     } 
     System.out.println(xsr.getLocalName()); 

     JAXBContext jc = JAXBContext.newInstance(StandardError.class); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     JAXBElement<StandardError> jb = unmarshaller.unmarshal(xsr, StandardError.class); 
     StandardError response = jb.getValue(); 
     System.out.println(response); 

     xsr.close(); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(jb, System.out); 
    } 

} 

StandardError的

下面是StandardError

package bgc.objects.rosy.standarderror.v3; 

//Compiled from StandardError.java (version 1.5 : 49.0, super bit) 
@javax.xml.bind.annotation.XmlAccessorType(value = javax.xml.bind.annotation.XmlAccessType.FIELD) 
@javax.xml.bind.annotation.XmlType(name = "", propOrder = { "code", "category", 
     "severity", "description", "environment", "correlationId" }) 
@javax.xml.bind.annotation.XmlRootElement(name = "StandardError") 
public class StandardError { 

    // Field descriptor #15 J 
    protected long code; 

    // Field descriptor #17 Ljava/lang/String; 
    @javax.xml.bind.annotation.XmlElement(required = true) 
    protected java.lang.String category; 

    // Field descriptor #17 Ljava/lang/String; 
    @javax.xml.bind.annotation.XmlElement(required = true) 
    protected java.lang.String severity; 

    // Field descriptor #24 Ljava/util/List; 
    // Signature: Ljava/util/List<Ljava/lang/String;>; 
    @javax.xml.bind.annotation.XmlElement(required = true) 
    protected java.util.List description; 

    // Field descriptor #17 Ljava/lang/String; 
    @javax.xml.bind.annotation.XmlElement(required = true) 
    protected java.lang.String environment; 

    // Field descriptor #17 Ljava/lang/String; 
    @javax.xml.bind.annotation.XmlElement(required = true) 
    protected java.lang.String correlationId; 

    // Field descriptor #17 Ljava/lang/String; 
    @javax.xml.bind.annotation.XmlAttribute 
    protected java.lang.String version; 

} 

包信息

我將使用類package-info上的@XmlSchema註釋來指定bgc.objects.rosy.standarderror.v3軟件包中類的名稱空間限定。

@XmlSchema(namespace="urn:v3.standarderror.vss.objects.bgc", elementFormDefault=XmlNsForm.QUALIFIED) 
package bgc.objects.rosy.standarderror.v3; 

import javax.xml.bind.annotation.*; 

輸出

下面是從運行演示代碼的輸出:

StandardError 
[email protected] 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<StandardError xmlns="urn:v3.standarderror.vss.objects.bgc"> 
    <code>209526</code> 
    <category>TECHNICAL</category> 
    <severity>ERROR</severity> 
    <description xmlns:ns10="urn:v3.standarderror.vss.objects.bgc">APC operation AUDIT on position L02LAB00075:1-1-1-5 
       returned an error : APC audit operation failed Caused by: 
       com.alcatel.ni.commands.framework.model.UnsupportedDslamException: 
       unsupported.dslam.message Caused by: Unsupported DSLAM. Internal 
       rollback of failed action : success.</description> 
    <environment>PRO</environment> 
    <correlationId></correlationId> 
</StandardError> 

更多信息

+0

我被限制爲僅使用JDK 1.5,如上所述一個請求1.6 – Reddy

+0

@NitinGurram - 您可以在JDK 1.5上使用上述方法,您只需要將StAX實現(如WoodStox)添加到您的課程路徑中。 –

+0

讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/15762/discussion-between-nitin-gurram-and-blaise-doughan) – Reddy