Java JAXB与继承

Java JAXB与继承,java,xml,jaxb,xsd,unmarshalling,Java,Xml,Jaxb,Xsd,Unmarshalling,我有这个xsd: <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/XsdMath2" xmlns:tns="http://www.example.org/XsdMath2" elementFormDefault=

我有这个xsd:

    <?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/XsdMath2" 
        xmlns:tns="http://www.example.org/XsdMath2" 
        elementFormDefault="qualified">


    <complexType name="Utilisateur">
        <complexContent>
            <extension base="tns:TraitementDTO">
                <sequence>
                    <element name="nomUtilisateur" type="string"></element>
                    <element name="passUtilisateur" type="string"></element>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

 <complexType name="TraitementDTO">
        <sequence>
            <element name="CodeTraitement" type="int"></element>
        </sequence>
    </complexType>


    <element name="Create" type="tns:TraitementDTO"></element>
</schema>
我如何获取数据,因为我尝试了一些解决方案,但它不起作用。我的Xsd检索我的数据是否正确?
关于

您的XML与您的XML架构不匹配。如果填充对象模型,然后封送它,您将看到XML应该是什么样子

封送员示例 MarshalDemo

package ActionMathML;

import javax.xml.bind.*;

public class MarshalDemo {

    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance("ActionMathML");

        ObjectFactory objectFactory = new ObjectFactory();

        Utilisateur utilisateur = objectFactory.createUtilisateur();
        utilisateur.setCodeTraitement(0);
        utilisateur.setNomUtilisateur("nomok");
        utilisateur.setPassUtilisateur("passok");

        JAXBElement<TraitementDTO> jaxbElement = objectFactory.createCreate(utilisateur);

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

}
package ActionMathML;

import java.io.File;
import javax.xml.bind.*;

public class UnmarshalDemo {

    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance("ActionMathML");

        Unmarshaller unmarshaller = context.createUnmarshaller();
        File xml = new File("src/ActionMathML/input.xml");
        JAXBElement<TraitementDTO> jaxbElement = (JAXBElement<TraitementDTO>) unmarshaller.unmarshal(xml);

        TraitementDTO traitementDTO = jaxbElement.getValue();
        System.out.println(traitementDTO.getCodeTraitement());

        if(traitementDTO instanceof Utilisateur) {
            Utilisateur utilisateur = (Utilisateur) traitementDTO;
            System.out.println(utilisateur.getNomUtilisateur());
            System.out.println(utilisateur.getPassUtilisateur());
        }
    }

}
更多信息 我在我的博客上写了更多关于JAXB和继承的内容:


啊?如何获得正确的xml?因此,问题涉及标记“”?@user3557873-我已经更新了我的答案,向您展示了xml应该是什么样子。注意,在XML模式中没有
TraitementDTO
usilimateur
元素。好的,但是您已经为TraitementDTO的类检索了数据,但我无法捕获我的类“usilimateur”的数据?这是不可能的吗?@Hann-我已经更新了我的答案,以显示
usilizateur
类中的信息。请注意
Create
元素上
xsi:type
属性的值,该属性指定类型为
usilizateur
。您太棒了,它正在工作,非常感谢。您有一位JAxb方面的专家:)。谢谢布莱斯
package ActionMathML;

import javax.xml.bind.*;

public class MarshalDemo {

    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance("ActionMathML");

        ObjectFactory objectFactory = new ObjectFactory();

        Utilisateur utilisateur = objectFactory.createUtilisateur();
        utilisateur.setCodeTraitement(0);
        utilisateur.setNomUtilisateur("nomok");
        utilisateur.setPassUtilisateur("passok");

        JAXBElement<TraitementDTO> jaxbElement = objectFactory.createCreate(utilisateur);

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

}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Create xmlns="http://www.example.org/XsdMath2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Utilisateur">
    <CodeTraitement>0</CodeTraitement>
    <nomUtilisateur>nomok</nomUtilisateur>
    <passUtilisateur>passok</passUtilisateur>
</Create>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Create xmlns="http://www.example.org/XsdMath2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Utilisateur">
    <CodeTraitement>0</CodeTraitement>
    <nomUtilisateur>nomok</nomUtilisateur>
    <passUtilisateur>passok</passUtilisateur>
</Create>
package ActionMathML;

import java.io.File;
import javax.xml.bind.*;

public class UnmarshalDemo {

    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance("ActionMathML");

        Unmarshaller unmarshaller = context.createUnmarshaller();
        File xml = new File("src/ActionMathML/input.xml");
        JAXBElement<TraitementDTO> jaxbElement = (JAXBElement<TraitementDTO>) unmarshaller.unmarshal(xml);

        TraitementDTO traitementDTO = jaxbElement.getValue();
        System.out.println(traitementDTO.getCodeTraitement());

        if(traitementDTO instanceof Utilisateur) {
            Utilisateur utilisateur = (Utilisateur) traitementDTO;
            System.out.println(utilisateur.getNomUtilisateur());
            System.out.println(utilisateur.getPassUtilisateur());
        }
    }

}
0
nomok
passok