使用 Castor XML 映射解组时忽略字段
Ignoring fields when unmarshalling using Castor XML Mapping
我需要将 XML 转换为一个对象(解组),但有一个字段(标签)我不希望它被映射。我一直在 Whosebug 中寻找答案,但只找到了如何将对象转换为 XML(编组),我需要了解(解组)。这是 XML:
<autorizacion>
<estado>AUTORIZADO</estado>
<numeroAutorizacion>9999999999999</numeroAutorizacion>
<fechaAutorizacion>17/06/2015</fechaAutorizacion>
<comprobante>
<comprobanteRetencion id="comprobante" version="1.0.0">
<infoAdicional>
<campoAdicional nombre="correo:">jeje@hotmail.com</campoAdicional>
</infoAdicional>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" Id="Signature89637">
<ds:KeyInfo Id="Certifixxxxxx0">
<ds:Modulus>
ppFiiWXmjvwteDiLvklh38gGypZ8moRjEhEijs0kfjpddd1NTJ5QWmNtgH8uVUP5aEduxPMYQPpg
</ds:Modulus>
</ds:KeyInfo>
</ds:Signature>
</comprobanteRetencion>
</comprobante>
</autorizacion>
我想从解组过程中排除标签 Signature。
这是映射 XML:
<class name="ec.eac.sitac.esigef.ComprobanteRetencion" auto-complete="true">
<map-to xml="comprobanteRetencion" />
<field name="infoAdicional" type="ec.eac.sitac.esigef.InfoAdicional">
<bind-xml name="infoAdicional" node="element" />
</field>
</class>
任何未映射的元素都将被忽略,除非您根据架构进行验证。
示例:
@XmlRootElement(name="A")
public class A {
@XmlElement(name="B")
String b;
}
测试代码:
String xml = "<A><B>Hello</B><C>World</C></A>";
JAXBContext jaxb = JAXBContext.newInstance(A.class);
Unmarshaller unmarshaller = jaxb.createUnmarshaller();
A a = (A)unmarshaller.unmarshal(new StringReader(xml));
System.out.println(a.b);
输出:
Hello
如您所见,<B>
的值未编组,<C>
的值被忽略。
更新
要明确忽略 <C>
的值,请添加一个虚拟 setter 方法:
@XmlElement(name="C")
void setC(String c) {/*ignore*/}
我使用以下方法删除了标签:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(xmlPath);
Node node = xml.getElementsByTagName("comprobanteRetencion").item(0);
Node signature = node.getLastChild();
node.removeChild(signature);
我需要将 XML 转换为一个对象(解组),但有一个字段(标签)我不希望它被映射。我一直在 Whosebug 中寻找答案,但只找到了如何将对象转换为 XML(编组),我需要了解(解组)。这是 XML:
<autorizacion>
<estado>AUTORIZADO</estado>
<numeroAutorizacion>9999999999999</numeroAutorizacion>
<fechaAutorizacion>17/06/2015</fechaAutorizacion>
<comprobante>
<comprobanteRetencion id="comprobante" version="1.0.0">
<infoAdicional>
<campoAdicional nombre="correo:">jeje@hotmail.com</campoAdicional>
</infoAdicional>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" Id="Signature89637">
<ds:KeyInfo Id="Certifixxxxxx0">
<ds:Modulus>
ppFiiWXmjvwteDiLvklh38gGypZ8moRjEhEijs0kfjpddd1NTJ5QWmNtgH8uVUP5aEduxPMYQPpg
</ds:Modulus>
</ds:KeyInfo>
</ds:Signature>
</comprobanteRetencion>
</comprobante>
</autorizacion>
我想从解组过程中排除标签 Signature。
这是映射 XML:
<class name="ec.eac.sitac.esigef.ComprobanteRetencion" auto-complete="true">
<map-to xml="comprobanteRetencion" />
<field name="infoAdicional" type="ec.eac.sitac.esigef.InfoAdicional">
<bind-xml name="infoAdicional" node="element" />
</field>
</class>
任何未映射的元素都将被忽略,除非您根据架构进行验证。
示例:
@XmlRootElement(name="A")
public class A {
@XmlElement(name="B")
String b;
}
测试代码:
String xml = "<A><B>Hello</B><C>World</C></A>";
JAXBContext jaxb = JAXBContext.newInstance(A.class);
Unmarshaller unmarshaller = jaxb.createUnmarshaller();
A a = (A)unmarshaller.unmarshal(new StringReader(xml));
System.out.println(a.b);
输出:
Hello
如您所见,<B>
的值未编组,<C>
的值被忽略。
更新
要明确忽略 <C>
的值,请添加一个虚拟 setter 方法:
@XmlElement(name="C")
void setC(String c) {/*ignore*/}
我使用以下方法删除了标签:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(xmlPath);
Node node = xml.getElementsByTagName("comprobanteRetencion").item(0);
Node signature = node.getLastChild();
node.removeChild(signature);