将xml的一部分解组为一个对象

我试图取消一个xml,这个问题变成了噩梦。 所以我有一个想法,将这个xml的一部分解组为一个对我来说必需的对象。

原始xml: http : //snipurl.com/24qkyi7

现在我需要的xml是: http : //snipurl.com/24qkyyl

我有两个xmls的类和其他相关信息。

如果我手动将此数据http://snipurl.com/24ql04x提供给unmarshall,我将获得StandardError对象。 但我可以直接给原始的xml来获取它的对象。

ps:使用JAXB

原始xml解析的堆栈跟踪: http : //snipurl.com/24qtrnv原始xml类的类文件,我无法解组。 这个http://snipurl.com/24qttn8没有源代码控制

StandardError类: http : //snipurl.com/24rpdld主xml类: http : //snipurl.com/24rpdxu

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

我将使用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 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; @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 bgc.objects.rosy.standarderror.v3.StandardError@31884174   209526 TECHNICAL ERROR 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. PRO   

了解更多信息