【问题标题】:Ignoring fields when unmarshalling using Castor XML Mapping使用 Castor XML 映射解组时忽略字段
【发布时间】:2015-09-20 21:52:43
【问题描述】:

我需要将 XML 转换为对象(解组),但有一个字段(标签)我不希望它被映射。我一直在 StackOverFlow 中寻找答案,但只找到了如何将对象转换为 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>

我想从解组过程中排除标记签名。

这里是映射 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>

【问题讨论】:

  • 你找到答案了吗? ;-)
  • 是的,我找到了。我刚刚添加了答案。也许这不是一个优雅的解决方案,但它确实有效。

标签: java xml unmarshalling castor


【解决方案1】:

任何未映射的元素都将被忽略,除非您根据架构进行验证。

例子:

@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

如您所见,&lt;B&gt; 的值被解组,&lt;C&gt; 的值被忽略。

更新

要显式忽略&lt;C&gt; 的值,请添加一个虚拟setter 方法:

@XmlElement(name="C")
void setC(String c) {/*ignore*/}

【讨论】:

  • 我映射了除“签名”标签之外的所有标签,当我运行我的应用程序时,我收到以下错误:无法找到签名的 FieldDescriptor...
  • 我没有使用 java 注释,我使用的是 xml 配置文件。如何使用 xml 配置文件排除标签?
  • xml映射仍然映射到setter方法,所以只映射到dummy setter方法。
  • 1-向 ComprobanteRetencion xml 映射文件添加了一个字段 2-向 Java 类 ComprobanteRetencion 添加了一个属性 3-添加了一个空的 setSignature 方法 >仍然收到错误:UnmarshallingFailureException: SAX reader exception;嵌套异常是 org.xml.sax.SAXException:无法在 ComprobanteRetencion 的 ClassDescriptor 中找到“Signature”的 FieldDescriptor
【解决方案2】:

我使用以下方法删除了标签:

        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);

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2021-06-22
    • 2015-07-05
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    相关资源
    最近更新 更多