如何用多个命名空间解组此xml

问题描述:

我定义了两个类来解组xml,但是我得到的结果始终为null;如何用多个命名空间解组此xml

@XmlRootElement(name="ValidateApiUserResponse", namespace="http://ops.net/AdminAPI_Admin") 

公共类ValidateApiUserResult延伸OrionResponse {

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private ValidateApiUserResponse validateApiUserResult; 

@XmlElement(name = "ValidateApiUserResult", namespace = DataStructuresNS.VanguardAdminNS) 
public ValidateApiUserResponse getValidateApiUserResult() { 
    return validateApiUserResult; 
} 

public void setValidateApiUserResult(ValidateApiUserResponse validateApiUserResult) { 
    this.validateApiUserResult = validateApiUserResult; 
} 

}

公共类ValidateApiUserResponse实现java.io.Serializable {

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private String[] claims; 
private Boolean isValid; 
private int[] validServerIds; 

public ValidateApiUserResponse() { 
} 

public ValidateApiUserResponse(String[] claims, Boolean isValid, int[] validServerIds) { 
     this.claims = claims; 
     this.isValid = isValid; 
     this.validServerIds = validServerIds; 
} 

@XmlElement(name = "Claims", namespace = DataStructuresNS.VanguardAdminNS) 
public String[] getClaims() { 
    return claims; 
} 

public void setClaims(String[] claims) { 
    this.claims = claims; 
} 

@XmlElement(name = "IsValid", namespace = DataStructuresNS.VanguardAdminNS) 
public Boolean getIsValid() { 
    return isValid; 
} 

public void setIsValid(Boolean isValid) { 
    this.isValid = isValid; 
} 

@XmlElement(name = "ValidServerIds", namespace = DataStructuresNS.VanguardAdminNS) 
public int[] getValidServerIds() { 
    return validServerIds; 
} 

public void setValidServerIds(int[] validServerIds) { 
    this.validServerIds = validServerIds; 
} 

}

这是一个命名空间

public class DataStructuresNS { 

public static final String VanguardAdminNS = "http://schemas.datacontract.org/2004/07/Admin.DataStructures"; 

}

然后我尝试解组

String abc = "<ValidateApiUserResponse xmlns=\"http://ops.net/AdminAPI_Admin\">\n" + 
    "   <ValidateApiUserResult xmlns:a=\"http://schemas.datacontract.org/2004/07/Admin.DataStructures\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + 
    "   <a:Claims xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">\n" + 
    "    <b:string>Admin</b:string>\n" + 
    "    <b:string>MANAGER</b:string>\n" + 
    "   </a:Claims>\n" + 
    "   <a:IsValid>true</a:IsValid>\n" + 
    "   <a:ValidServerIds xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">\n" + 
    "    <b:int>5001</b:int>\n" + 
    "   </a:ValidServerIds>\n" + 
    "   </ValidateApiUserResult>\n" + 
    "  </ValidateApiUserResponse>"; 

    JAXBContext jaxbContext = JAXBContext.newInstance(ValidateApiUserResult.class); 
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 

    ValidateApiUserResult root = (ValidateApiUserResult)unmarshaller.unmarshal(new StringReader(abc)); 

根我得到的是空

+0

http://*.com/questions/6895486/jaxb-need -namespace-prefix-to-all-the-elements – LowLevel

尝试此根类:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="ValidateApiUserResponse", namespace="http://ops.net/AdminAPI_Admin") 
public class ValidateApiUserResult extends OrionResponse { ... } 
+0

它不起作用,我不认为XmlAccessorType在这里很有用 –

我定义数组新类,并在@XmlElement添加类型属性。 例如:

private OrionString[] claims; 

@XmlElement(name = "Claims", namespace = "xxxxx", type=OrionString.class) 
public OrionString[] getClaims() { 
    return claims; 
} 

这是我所定义

public class OrionString { 

private String[] oString; 

@XmlElement(name = "string", namespace = "http://schemas.microsoft.com/2003/10/Serialization/Arrays") 
public String[] getoString() { 
    return oString; 
} 

public void setoString(String[] oString) { 
    this.oString = oString; 
} 

}新的类