xml注释,可以阻止将属性转换为xml字符串

时间:2013-07-22 15:28:23

标签: java xml annotations

我在课堂上有一个属性'abc'。我想将此属性限制为转换为XML String格式 是否有可以在属性上使用的XMl Annotation,以避免将其转换为XML String?

有人请帮助我。

4 个答案:

答案 0 :(得分:3)

您可以使用@XmlTransient注释 有关@XmlTransient Sample的更多信息,请访问{{3}} 下面是在JAXB中避免XML转换中的“password”属性的示例。所以它用
带注释 @XmlTransient注释

    import java.util.List;
    import javax.xml.bind.annotation.*;

   @XmlRootElement
   @XmlType(propOrder = { "phoneNumbers", "name"})
   public class Customer extends Person {

   private String password;
   private List<String> phoneNumbers;

   @XmlTransient
   public String getPassword() {
        return password;
   }

   public void setPassword(String password) {
       this.password = password;
   }

  @XmlElement(name = "phone-number")
  public List<String> getPhoneNumbers() {
    return phoneNumbers;
  }

  public void setPhoneNumbers(List<String> phoneNumbers) {
    this.phoneNumbers = phoneNumbers;
  }


 }   
 /* demo class*/ 
  public class Demo {

    public static void main(String[] args) throws Exception {
         JAXBContext jc = JAXBContext.newInstance(Customer.class);

         Unmarshaller unmarshaller = jc.createUnmarshaller();
         File xml = new File("input.xml");
        Customer customer = (Customer) unmarshaller.unmarshal(xml);

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

  }  


  /*Generated xml doesn't have password tag */  
  /* <?xml version="1.0" encoding="UTF-8"?>  
     <customer>  
        <id>123</id>
        <phone-number>555-1111</phone-number>
        <phone-number>555-2222</phone-number>
        <name>Jane Doe</name>
     </customer>  
  */

答案 1 :(得分:3)

当您使用JAXB (JSR-222)实现来处理XML时,在排除属性时有几个选项。

选项#1 - @XmlTransient

排除字段/属性的最常用方法是使用@XmlTransient对其进行注释。

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlTransient
    private String foo;

    private String bar;

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

选项#2 - @XmlAccessorType(XmlAccessType.NONE)

如果您想要排除超过一半的属性,我建议您在课堂上设置@XmlAccessorType(XmlAccessType.NONE)。然后,只会映射带注释的字段/属性。在下面的示例中,我们不必排除foo,但必须明确包含bar。

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Root {

    private String foo;

    @XmlElement
    private String bar;

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

选项#3 - 瞬态

如果您正在使用字段访问权限,那么您也可以简单地将该字段标记为瞬态以将其排除。

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    private transient String foo;

    private String bar;

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

<强>演示

无论您选择哪个选项,都可以使用以下演示代码。

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.setFoo("FOO");
        root.setBar("BAR");

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

}

<强>输出

在输出中,我们看到foo元素从输出中排除。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <bar>BAR</bar>
</root>

了解更多信息

答案 2 :(得分:1)

您在寻找@XMLTransient吗?

答案 3 :(得分:1)

@XmlTransient阻止将属性转换为xml