IT源码网

java之JAXB 和继承

webabcd 2024年06月03日 程序员 22 0

我有这个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> 

我想知道我的“Utilisateur”类的数据,但使用我的 xml:

 <Create xmlns="http://www.example.org/XsdMath2"> 
       <TraitementDTO> 
          <CodeTraitement>0</CodeTraitement> 
            <Utilisateur> 
               <nomUtilisateur>nomok</nomUtilisateur> 
               <passUtilisateur>passok</passUtilisateur> 
             </Utilisateur> 
       </TraitementDTO> 
    </Create> 

我无法创建(实例)我的类“TraitementDTO”,或者我无法在我的类“Utilisateur”或 Cast 中使用函数。但它不起作用。 我的代码java:

 StringReader sr = new StringReader(this.message); 
    JAXBContext context = JAXBContext.newInstance("ActionMathML"); 
    Unmarshaller decodeur = context.createUnmarshaller(); 
     msgObject = decodeur.unmarshal(sr);   
 
         System.out.println(" action" + msgObject); 
 
     if (msgObject instanceof TraitementDTO) 
    { 
         System.out.println(" action"); 
    } 

我如何获取我的数据,因为我尝试了一些解决方案,但它不起作用。我的 Xsd 是否可以正确检索我的数据? 问候

请您参考如下方法:

您的 XML 与您的 XML 架构不匹配。如果您填充对象模型然后对其进行编码,您将看到 XML 应该是什么样子。

编码(marshal)示例

编码(marshal)演示

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 架构的 XML 的外观。

<?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> 

解码示例

input.xml

<?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> 

UnmarshalDemo

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 

了解更多信息

我在我的博客上写了更多有关 JAXB 和继承的内容:


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!