具有属性和内容的元素的XSD架构和JAXB类

时间:2015-10-13 20:59:55

标签: java xml xsd jaxb

我有一个非常复杂的XML树结构,其中包含许多元素。对于每个元素,提交者可以选择值是否保密。目前,我考虑的解决方案类似于以下示例:

<Person>
    <Lastname confidential="true">Doe<Lastname>
    <Fistname confidential="false">John<Fistname>
    <Addresses>
        <Address>
             <Street confidential="false">aaaaaaa</Street>
             <ZipCode confidential="true">75000</ZipCode>
             <City confidential="false">Paris</City>
             <Country confidential="true">FR</Country>
        </Address>
        ...
    <Adresses>
    <Email confidential="true">john.doe@mail.com<Email>
    <Phone confidential="true">+33110111213<Phone>
    ...
</Person>

我不是专家,但我想避免为每个元素生成特定类型(在XSD架构中)和特定类(使用JAXB)。可能吗 ?否则,你有什么想法来解决我的问题吗?

非常感谢您的帮助

4 个答案:

答案 0 :(得分:0)

你的问题有点不清楚。你想要避免什么? 我对你想要做的事情的方法就是这样的

  1. 使用您想要定义的所有元素形成正确的XML 您可以在此处验证您的XML Validate an XML

    <Person>
        <Lastname confidential="true">Doe</Lastname>
        <Fistname confidential="false">John</Fistname>
        <Addresses>
            <Address>
                 <Street confidential="false">aaaaaaa</Street>
                 <ZipCode confidential="true">75000</ZipCode>
                 <City confidential="false">Paris</City>
                 <Country confidential="true">FR</Country>
            </Address>
        </Addresses>
        <Email confidential="true">john.doe@mail.com</Email>
        <Phone confidential="true">+33110111213</Phone>
    </Person>

  2. 为您从此处生成的XML生成XML架构XML to XSD generator有3种算法/模式

  3. 在eclipse中生成JAXB类。 Eclipse具有输入功能,允许您生成JAXB类Generating JAXB Classes from a Schema

答案 1 :(得分:0)

很抱歉,如果我不清楚的话。实际上,我已经生成了我的XSD和相应的Java类。 我的问题是,如果可能的话,我想避免产生类似的东西:

XSD类型:

<xs:complexType name="ZipCodeType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="confidential"/>
      </xs:extension>
    </xs:simpleContent>
</xs:complexType>

及其相应的Java类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ZipCodeType", propOrder = {
    "value"
})
public class ZipCodeType {

@XmlValue
protected String value;
@XmlAttribute(name = "confidential")
protected String confidential;

我有一个很大的XML结构,使用这个方法我每个元素都有一个类型/类,所以它意味着很多类和一个非常大的XSD。这是我想避免的,但也许这是不可能的? 否则,我为了管理数据的机密性而讨论任何其他命题?

由于

答案 2 :(得分:0)

您可以在xsd:

中执行此操作
<xsd:complexType name="Person">
    <xsd:sequence>
        <xsd:element name="LastName" type="xsd:string"/>
        <xsd:element name="FirstName" type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="lastNameConfidential" type="xsd:boolean" default="false"/>
    <xsd:attribute name="firstNameConfidential" type="xsd:boolean" default="false"/>
</xsd:complexType>

所以你的XML看起来像这样(你只需提供你想要保密的属性,因为默认是假的):

<Person lastNameConfidential="true">
    <LastName>Doe</LastName>
    <FirstName>John</FirstName>        
</Person>

生成的JAXB类看起来像:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Person", propOrder = {
    "lastName",
    "firstName"
})
public class Person {

    @XmlElement(name = "LastName", required = true)
    protected String lastName;
    @XmlElement(name = "FirstName", required = true)
    protected String firstName;
    @XmlAttribute(name = "lastNameConfidential")
    protected Boolean lastNameConfidential;
    @XmlAttribute(name = "firstNameConfidential")
    protected Boolean firstNameConfidential;

    // Code ommitted 

    public boolean isLastNameConfidential() {
        if (lastNameConfidential == null) {
            return false;
        } else {
            return lastNameConfidential;
        }
    }

    public boolean isFirstNameConfidential() {
        if (firstNameConfidential == null) {
            return false;
        } else {
            return firstNameConfidential;
        }
    }
}

答案 3 :(得分:0)

如果我理解正确,也许这与您的问题有关。我使用2种方法从XML / XSD生成java对象。

  1. eclipse工具 (此处有屏幕截图的详细步骤: https://sites.google.com/site/canadadennischen888/home/xml/jaxb-xml-to-pojo/xml-to-pojo/eclipse-feature

  2. XJC (xjc file_name.xsd -d folder_name -p package)

  3. 希望有所帮助