Java 具有属性和内容的元素的XSD模式和JAXB类

Java 具有属性和内容的元素的XSD模式和JAXB类,java,xml,xsd,jaxb,Java,Xml,Xsd,Jaxb,我有一个非常复杂的XML树结构,其中包含很多元素。对于每个元素,提交者可以选择值是否为机密。目前,我考虑的解决方案类似于下面的例子: <Person> <Lastname confidential="true">Doe<Lastname> <Fistname confidential="false">John<Fistname> <Addresses> <Address>

我有一个非常复杂的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>

雌鹿
约翰
AAAAAAAA
75000
巴黎
FR
...
厕所。doe@mail.com
+33110111213
...
我不是专家,但我希望避免为每个元素生成特定类型(在XSD模式中)和特定类(使用JAXB)。可能吗?否则,你有什么办法来解决我的问题吗


非常感谢您的帮助

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

  • 使用要定义的所有元素形成正确的XML 您可以在这里验证XML
    
    雌鹿
    约翰
    AAAAAAAA
    75000
    巴黎
    FR
    厕所。doe@mail.com
    +33110111213
    
    对不起,我不清楚。事实上,我已经生成了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>
    
    我有一个大的XML结构,使用这个方法,每个元素有一个类型/类,所以它意味着很多类和一个非常大的XSD。这是我想避免的,但也许这是不可能的? 否则,为了管理数据的机密性,我是否对任何其他提议感兴趣


    谢谢

    您可以在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/XSD生成java对象

  • eclipse工具 (此处有屏幕截图的分步详细信息: )

  • xjc (xjc文件_name.xsd-d文件夹_name-p包)


  • 希望能有所帮助

    您应该将这些额外的信息添加到您的问题中,而不是作为答案。我没有想到这个解决方案,但我喜欢它。非常感谢你
    <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>
    
    <Person lastNameConfidential="true">
        <LastName>Doe</LastName>
        <FirstName>John</FirstName>        
    </Person>
    
    @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;
            }
        }
    }